MAUI 入门教程系列(1.框架简介)

前言

在2020年5月, 微软宣布了MAUI跨平台框架, MAUI 是Xamarin.Forms演变而来, 这也就意味着, 如果你原来具备Xamarin.Forms开发经验, 你可以流畅的过渡到MAUI开发当中。
原本于2021年底发布的MAUI正式版被推迟到了2022年5月底发布。现在, 你目前可以通过安装VS2022 预览版进行安装MAUI开发选项。此版本中, 将不会存在Xamarin.Forms项目模板。

MAUI新特性一览

  • 单个代码库支持多个平台

  • 完整的热重载功能 (.NET/XAML)

  • 原生平台UI

  • 支持完整的自绘

  • 多窗口模式

  • 集成跨平台本机API

  • 支持.NET6/C#10新特性

Xamarin.Forms VS MAUI

平台架构

首先,平台架构的主要变化是.NET MAUI与.NET 6.0集成.

Xamarin.Forms.NET MAUI
02774d6c776d764681033c578983e5fe.pngb5edf16748d7a5e4852a8e1177b9db9e.png

项目结构

Xamarin.Forms和.NET MAUI之间的主要区别在于它们的项目结构。

Xamarin.FormsMAUI
每个平台维护一个单独的项目一个项目支持多个平台
平台相关的代码在不同项目中单独维护在Platforms文件夹中维护

使用Xamarin.Forms,开发人员可能会在处理针对多个平台的多个项目时感到繁琐。图像,字体和平台相关代码的维护;添加不同的依赖项,并在它们被引用为 NuGet 包时解析它们。遇到这些问题后,开发人员现在可以在 .NET MAUI 中通过单个项目得到解决。

由于 .NET MAUI 是一个简单的项目应用,因此它可以在基于多目标的结构上运行。.NET MAUI 应用包含一个 “Platforms” 文件夹,其子文件夹表示 Android、iOS Maccatalyst 和 Windows 等平台,以定位在平台上启动应用的特定于平台的代码。它也可以根据您自己的文件名进行多目标。

支持的平台和版本

Xamarin和.NET MAUI之间平台支持的主要区别在于它们对Windows的支持。Xamarin 支持 UWP,而 .NET MAUI 支持 WinUI。有关支持版本的详细信息,请查看下表。

Xamarin.FormsMAUI
- Android 4.4 (API 19) 或更高版本
- iOS 9 或更高版本
- UWP:Windows 10,内部版本 10.0.16299.0 或更高版本,用于 .NET Standard 2.0 支持
- Android 5.0 (API 21) 或更高版本。
- iOS 10 或更高版本。
- macOS 10.13 或更高版本
- WinUI:Windows 11 和 Windows 10 版本 1809 或更高版本
其他平台支持:
Tizen
macOS 10.13 或更高版本
GTK#
WPF
其他平台支持:
Tizen,由三星支持。
Linux,由社区支持。

.NET CLI

.NET 命令行界面 (CLI) 是一个跨平台工具链,用于开发、构建、运行和发布 .NET 应用程序。此 .NET CLI 为 .NET MAUI 应用程序提供了无缝的构建和运行体验。

Xamarin.Forms.NET MAUI
Xamarin 支持 .NET Framework 来构建和运行应用。.NET MAUI 支持 .NET CLI 工具链来构建、运行和发布 .NET 应用程序。

渲染器和处理程序架构

在 Xamarin 中,控件是使用呈现器创建的。当开发人员想要自定义本机控件的 UI 时,他们必须使用自定义呈现器来执行此操作。这些渲染器在性能和应用大小方面花费了大量用户。
但是 .NET MAUI 使用的处理程序体系结构与本机程序集非常松散地耦合。借助本机平台,这会产生具有更好性能的轻量级应用程序。
如果需要,可以在此处使用渲染器。移植时,可以重用 Xamarin.Forms 自定义呈现器。

Xamarin.Forms.NET MAUI
使用呈现器体系结构。使用处理程序体系结构。
与本机控件紧密耦合。与本机控件松散耦合。
不能在使用处理程序。如果需要,可以在此处使用渲染器。移植时,可以重用 Xamarin.Forms 自定义呈现器。
b33a93b17187bf03f75fbcf872e2380f.pnga29936677a04ece6b95ccc27d9a2b58b.png

.NET 6

.NET MAUI 已集成到 .NET 6 中,而 Xamarin.Forms 是一个 .NET Framework。由于 .NET 6 集成,您可以在 .NET MAUI 中使用以下 .NET 6 和 C#10 功能。

资源管理

.NET MAUI在资源方面接管了Xamarin,特别是在图像方面。您无需维护一组映像即可满足特定于平台或设备的需求。单个 SVG 图像足以满足所有平台和设备要求。SVG图像被转换为.png图像,以便在所有平台上工作。

Xamarin.Forms.NET MAUI
资源包括图像和类。资源包括MauiImage和MauiResources等类。
需要为特定于平台的设备维护基于分辨率的图像。借助 SVG 图像,无需维护特定于平台或特定于设备的图像。
需要为每个平台单独维护资源文件。资源可以在单个位置进行维护。

热重载支持

Xamarin.Forms.NET MAUI
.NET热重载:

不支持(但 UWP 对使用 的运行时编辑的支持有限)。

NET 的编辑和继续功能)。

.NET热重载:
提供完整的 .NET 热重载支持。
XAML热重载:
实验的:SDK 4.x 和 Visual Studio 2019 版本 16.9 之前的版本。
功能完成:SDK 5.x 和 Visual Studio 2019 版本 16.9 或更高版本。
XAML热重载:
提供完整的支持。

图形绘制

在 Xamarin 中,没有可用于满足任何绘图要求的直接 API。您必须使用渲染器在本机端执行此操作。但.NET MAUI现在抽象化了本机绘图,并为您带来了更好的图形 API。.NET MAUI中的跨平台图形功能提供了用于绘制和绘制形状的绘图画布。画笔是主要类型。

Xamarin.Forms.NET MAUI
没有可用的图形。图形模式,如绘画,混合可用。
无法自定义绘图。支持绘制图形
颜色画笔

配置资源和服务

与 Xamarin 不同,.NET MAUI 应用是使用 .NET 通用主机引导的。因此,如果要初始化任何字体,服务或第三方组件,则可以从单个位置完成。

public static MauiApp CreateMauiApp()
	{
		var builder = MauiApp.CreateBuilder();
		builder
			.UseMauiApp<App>()
			.ConfigureFonts(fonts =>
			{
				fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
				fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
			});

		return builder.Build();
	}

可访问性

通常在 Xamarin 中,我们使用自动化属性和本机 API 为屏幕阅读器提供对应用中所用控件中文本的适当辅助功能。
Xamarin.Forms 辅助功能
但 .NET MAUI 提供语义属性以在应用中提供辅助功能值(您可以在 .NET MAUI 中使用自动化属性,但推荐的方法是语义属性)。、
MAUI 可访问性

Blazor应用程序

在 Xamarin 中无法开发 Blazor 混合应用,但你可以生成 .NET MAUI Blazor 应用。
d6a07fbad8a49781a31e7982083398fc.png

跨平台API

Xamarin.Forms.NET MAUI
可以使用 Xamarin.Essentials 执行设备功能的跨平台 API。设备功能的跨平台 API 也与 Microsoft.Maui.Essentials 命名空间下的 MAUI 集成。

多窗口

在.NET MAUI中,可以一次在Android,iPad上的iOS,Mac Catalyst和Windows上打开多个窗口。此支持在 Xamarin 中不可用。

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用MAUI开发Android应用时,如果在非UI线程中尝试操作UI视图,可能会报错Android.Util.AndroidRuntimeException: 'Only the original thread that created a view hierarchy can touch its views.'。这是因为Android要求只有创建UI视图的原始线程才能操作它们。 为了解决这个问题,你可以使用以下方法之一: 1. 使用主线程更新UI视图:在非UI线程中,你可以使用`Activity.runOnUiThread()`方法或`View.post()`方法将UI操作发送到主线程执行。这样可以确保在主线程中更新UI视图,避免报错。 ```java runOnUiThread(new Runnable() { public void run() { // 在这里更新UI视图 } }); ``` 2. 使用Handler更新UI视图:你可以创建一个Handler对象,并使用它来发送消息到主线程更新UI视图。 ```java Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { public void run() { // 在这里更新UI视图 } }); ``` 3. 使用AsyncTask更新UI视图:AsyncTask是Android提供的一个方便的类,用于在后台线程执行任务并在主线程更新UI视图。 ```java private class MyTask extends AsyncTask<Void, Void, Void> { protected Void doInBackground(Void... params) { // 在后台线程执行任务 return null; } protected void onPostExecute(Void result) { // 在主线程更新UI视图 } } // 启动AsyncTask new MyTask().execute(); ``` 以上是几种常用的方法,你可以根据具体情况选择适合你的方式来解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值