EP 32: TopStore App with .NET Multi-platform App UI (MAUI)

Hello, 各位 iT邦帮忙 的粉丝们大家好~~~

本篇是 Re: 从零开始用 Xamarin 技术来复刻过去开发的一个 App: TopStore 系列文的 EP32。

而本篇 EP32 要来介绍前面整个 EP1~EP21 所完成的双平台 TopStore App 在利用 Xamarin.Forms 所完成的部分,转换成目前接下来在 .NET 开发技术中颇受瞩目 .NET Multi-platform App UI (MAUI) 的撰写方式唷!

MAUI

首先若要将 Xamarin.Forms 转换成 .NET MAUI 的撰写,有几个需考量的条件:

  1. App 开发中利用到的 Xamarin.Forms 第三方套件是否已经支援 .NET 6 / MAUI
  2. 其 App 成长性是否需要迁移至 MAUI 之必要性来做发展。

.NET 6 是微软接下来长期支援的开发技术(LTS) 的 .NET 版本,而 .NET MAUI 并不会随着 .NET 6 正式释出的(2021/11/8) 时间点而正式释出,而是可能在 2022 年的 Q2 才有机会正式释出(有兴趣的朋友可以参考 GitHub 的 Projects)。

但若在这个时间点要完成 Xamarin.Forms 专案迁移至 .NET MAUI 的话,那本篇就来介绍介绍该怎麽个处理法罗~~~


如果以撰写本篇 EP32 的时间点来看,最新释出的是 "Visual Studio 2022 version 17.0 RC3 and Preview 7" 而 MAUI 则为 "Preview 9"

而或许有捧友会问,那怎只有 EP1~EP21 呢?

如果去看看 EP22 就会知道从这篇开始在介绍的是使用了 sqlite-net-pcl 这个 Nuget 套件 处理 SQLite 的介绍,而 sqlite-net-pcl 套件作者有在 GitHub 上说明会在 .NET MAUI 正式释出时支援

2021/11/13 补充更新:

若是要在 MAUI 专案当中使用 SQLite,可以考虑微软官方伴随 .NET 6 所释出的 EF Core for SQLite。

参考文件:

  1. [微软文件] 在 Xamarin 当中使用 EFCore: https://docs.microsoft.com/en-us/ef/core/get-started/xamarin
  2. EF Core 的 GitHub: https://github.com/dotnet/efcore
  3. EF Core for SQLite 的 Nuget: https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Sqlite

若如果已经装好 Visual Stuido 2022 version 17.0 RC3 and Preview 7 的版本,理论上记得再透过 Visual Studio Installer 安装的时候,记得要勾选 .NET MAUI 的 "个别元件" 安装,就可以在 Visual Studio 2022 当中选择到 MAUI 的专案范本。

01-1

新增专案。
01-2

在专案范本中搜寻 "MAUI"。
02-1

02-2

建立 "MAUI" 行动应用设定。
03

Visual Studio 2022 建立好 MAUI 的专案范本。
04

在预设的空白专案范本当中会有 MainPage.xaml 的预设页面。
05-1

要把 TopStore App 的 XAML 放进来,所以将这个 MainPage.xaml 删除。
05-2

"删除" 完毕。
05-3

接着把 EP21 的 TopStore App 在 Xamarin.Forms 专案中的程序 "复制"(除了 *.csproj、App.xaml/.cs、AssemblyInfo.cs 不复制,其他皆复选後复制)。
06-1

在 MAUI 的专案资料夹当中直接 "贴上"。
06-2

"贴上" 完成後档案总管的呈现。
06-3

"贴上" 完成後 Visaul Studio 2022 的方案总管呈现。
06-4

开启文字替换窗格,并将替换范围设定为整个方案。

在文字替换窗格当中将 **「xmlns="http://xamarin.com/schemas/2014/forms"」** 点选 "全部取代" 替换成 **「xmlns="http://schemas.microsoft.com/dotnet/2021/maui"」**。
07-1-1

在此次 TopStore App 的专案中的文字替换,共有 6 个替换,确定。
07-1-2

继续在文字替换窗格当中将 「Xamarin.Forms.Xaml」 点选 "全部取代" 替换成 「Microsoft.Maui.Controls.Xaml"」
07-2-1

在此次 TopStore App 的专案中的文字替换,共有 4 个替换,确定。
07-2-2

继续在文字替换窗格当中将 「Xamarin.Forms」 点选 "全部取代" 替换成 「Microsoft.Maui.Controls」
07-3-1

在此次 TopStore App 的专案中的文字替换,共有 13 个替换,确定。
07-3-2
(其中有两个替换是在 OrdersPage 与 SettingsPage 的 XAML 标记当中,有使用到 Label 标记所设定 Text 的显示文字,最後记得再去改一下。)

继续在文字替换窗格当中将 「Xamarin.Essentials」 点选 "全部取代" 替换成 「Microsoft.Maui.Essentials」
07-4-1

在此次 TopStore App 的专案中的文字替换,共有 1 个替换,确定。
07-4-2

接着打开 App.xaml 将原本 ResourceDictionary 的 XAML 标记内部包含的 XAML 标记圈选後删除。
08-1

并贴上原本在 TopStore App 的 Xamarin.Forms 当中的 App.xaml 所撰写的 Resource,并且补上其所需引用的 XAML 命名空间。
08-2

继续在 Application.Resources 的 XAML 标记之後,撰写 Application.MainPage 的 XAML 标记,并且在其中设计 Shell 的 XAML 标记。
08-3

完成後,打开 AppShell.xaml 并将当中撰写 TabBar 的 XAML 标记复制。
08-4-1

贴入刚刚在 App.xaml 中所设计的 Shell 的 XAML 标记当中。
08-4-2

并补上其所需引用的 XAML 命名空间。
08-4-3

打开 App.xaml.cs 将其中的 MainPage 指定 MainPage 产生的程序码给移除。
09-1

将原本 AppShell.xaml.cs 当中的路由指定,设定到此。
09-2

接着在 Visual Studio 的方案总管当中,把 Assets 资料夹当中的 FontAwesome5.otf 档案搬移到 Resources 底下的 Fonts 资料夹。
10-1

搬移完成。
10-2

若确定没问题,就可以把 Assets 资料夹与 AppShell.xaml 档案删除。
10-3

再打开 MauiProgram.cs 档案,并找到其中 .ConfigureFonts() 的部分。
10-4-1

将其原本设定的字型档,换成 TopStore App 当中所用的 FontAwesome5.otf。
10-4-2

接着在相容性当中透过右键选单选取 "新增参考"。
11-1

选取 Maui.Plugin.BaseBindingLibrary 的 dll。
11-2

把先前透过 Nuget 安装使用的 Xam.Plugin.BaseBindingLibrary 替换成 Maui.Plugin.BaseBindingLibrary。加入该 dll 的参考後,会看到在各个平台下的组件都增加了 "Maui.Plugin.BaseBindingLibrary"。
11-3
(之後会另外发布此 DLL 透过 Nuget 安装的版本)

在文字替换窗格当中将 Xam.Plugin 点选 "全部取代" 替换成 Maui.Plugin
11-4-1

在此次 TopStore App 的专案中的文字替换,共有 2 个替换,确定。
11-4-2

以上完成所以编辑後,会因为编译快取的问题而无法让 XAML 跟 .cs 顺利整合,目前的作法是关闭 Visual Studio 并重新开启专案。
12-1

关闭 Visual Studio 时记得储存所有变更。
12-2

再次重新开启此 TopStore App 的 MAUI 专案,就没有相关的错误讯息发生。
12-3

在方案总管当中透过选取右键选单的 "重建方案" 选项。
12-4-1

等待一段时间後,全部建置成功。
12-4-2

在上图的截图当中,眼尖的捧友应该会注意到 Visual Studio 是有跟 Mac 做连线的,所以按照目前 MAUI 的官方预设建置的平台,会建置 iOS、Android、macOS、Windows 的应用程序。

iOS Simulator:
12-5-1

Android Emulator:
12-5-2 Android-Emulator
(看来.NET MAUI for Android 还有待微软官方努力改进)

2022/02/13 补充更新:
在 MAUI Preview 12 当中已能正常显示 List 的客制化项目内容:
12-5-2 Android-Emulator

2022/04/16 补充更新:
在 MAUI Preview 14 当中已能正常显示 App Title 的 MenuItem 内容与操作(但 ListView 的项目在没有调整过去的撰写的 XAML 下跑版了?):
12-5-2 Android-Emulator

macOS MacCatalys:
12-5-3 MacCatalys

Windows 10
12-5-3 Windows 10


参考文件:

  1. Announcing .NET MAUI Preview 9:
    https://devblogs.microsoft.com/dotnet/announcing-net-maui-preview-9/

  2. Migrate your app from Xamarin.Forms:
    https://docs.microsoft.com/en-us/dotnet/maui/get-started/migrate

  3. Xamarin.Essentials 1.7 and introducing .NET MAUI Essentials:
    https://devblogs.microsoft.com/xamarin/xamarin-essentials-1-7-and-introducing-net-maui-essentials/


<<:  古典 java tomcat server 专案 dockerize 踩坑全记录

>>:  Vue3 ( CLI + github ) -4

【第十四天 - 堆叠型 SQL注入】

Q1. 什麽是 堆叠型 SQL注入? 堆叠型 SQL注入也称为 堆查询注入,英文为 stacked ...

Day 5 双向绑定及回圈

今天来介绍v-model&data跟v-for的用法 data→用来储存里面的资料,当dat...

Day 3: 人工智慧在音乐领域的应用 (各层面的应用二)

今天我们接续昨天的话题继续来聊聊AI在音乐领域上除了作曲以外的各方面应用。 谱面辨识/采谱系统 这边...

Day 22. RWD 响应式设计的利器- 理解 Figma 的 Constraints 机制

Constraints 是 Figma 中一个很重要的功能,它可以让我们的设计在做拉伸的时候,变的...

从零开始的8-bit迷宫探险【Level 1】一切都是从红白机开始的

哈罗~ 大家好,我是雪花冰 我是个从小喜欢玩电玩,立志长大要当 GM,却半路入坑程序这条不归路的攻城...