.NET 8 中 .NET MAUI 的新增功能
在 .NET 8 中,.NET MAUI 的重点是质量。 在 .NET 8 中,合并了 1618 个拉取请求,关闭了 689 个问题。 其中包括来自 .NET MAUI 团队和 .NET MAUI 社区的更改。 这些更改应能大幅提高 .NET 8 的质量。
重要说明
由于要与底层外部依赖关系(如 Xcode 或 Android SDK 工具)协同工作,.NET Multi-platform App UI (.NET MAUI) 支持策略不同于 .NET 和 .NET Core 支持策略。 有关详细信息,请参阅 .NET MAUI 支持策略。
在 .NET 8 中,.NET MAUI 作为 .NET 工作负载和多个 NuGet 包提供。 这种方法的优势在于,它使你能够轻松地将项目固定到特定版本,同时使你能够轻松预览未发布的版本或实验性版本。 创建新的 .NET MAUI 项目时,所需的 NuGet 包会自动添加到项目中。
本文列出了 .NET 8 中 .NET MAUI 的新增功能,并提供了每个功能的详细信息的链接。
有关 .NET 8 新增功能的信息,请参阅 .NET 8 的新增功能。
新功能
虽然此版本的 .NET MAUI 的重点是质量,但也有一些新功能可在应用中实现新的应用场景。
控件
- 支持文本输入增益扩展方法的控件,这些方法支持隐藏和显示软输入键盘。 有关详细信息,请参阅隐藏和显示软输入键盘。
- ContentPage 类获得一个 HideSoftInputOnTapped 属性,该属性可指示点击页面上的任意位置是否会导致软输入键盘隐藏(如果可见)。 有关详细信息,请参阅 ContentPage。
- BlazorWebView 获得一个 StartPath 属性、一个 TryDispatchAsync 方法和增强的日志记录功能。 有关详细信息,请参阅使用 BlazorWebView 在 .NET MAUI 应用中托管 Blazor Web 应用。
- WebView 获得一个 UserAgent 属性。 有关详细信息,请参阅 WebView。
- 默认情况下,IOS 上的 WebView 会启用 HTML5 视频的内联媒体播放,包括自动播放和画中画。 有关详细信息,请参阅在 iOS 和 Mac Catalyst 上设置媒体播放首选项。
- 可接受 5 个参数的
Grid.Add
重载已重新添加回 .NET MAUI。 但是,此方法已弃用,仅用于帮助从 Xamarin.Forms 迁移。 - Grid 获取一个 AddWithSpan 扩展方法,该方法可使用指定的行和列跨度在 Grid 指定行和列上添加视图。
桌面
- 可通过键盘快捷方式(称为键盘快捷键)调用菜单栏项和上下文菜单项。 有关详细信息,请参阅键盘快捷键。
- Windows 应用可作为未打包的应用发布。 有关详细信息,请参阅使用 CLI 发布适用于 Windows 的未打包 .NET MAUI 应用。
手势识别器
- PointerGestureRecognizer 获得 PointerPressedCommand、PointerPressedCommandParameter、PointerReleasedCommand、PointerReleasedCommandParameter 属性,以及 PointerPressed 和 PointerReleased 事件。 有关详细信息,请参阅识别指针手势。
- 随附 PointerGestureRecognizer 类引发的指针事件的 PointerEventArgs 对象获得一个类型为 PlatformPointerEventArgs 的 PlatformArgs 属性。 此属性可提供对指针手势事件的平台特定参数的访问权限。 有关详细信息,请参阅识别指针手势。
- 随附拖放手势事件的 DragStartingEventArgs、DragEventArgs、DropEventArgs 和 DropCompletedEventArgs 对象各获得一个
PlatformArgs
属性。 此属性可提供对拖放事件的平台特定参数的访问权限。 有关详细信息,请参阅识别拖放手势。 - 可以通过对 DragEventArgs、DragStartingEventArgs 或 DropEventArgs 对象调用 GetPosition 方法来获取拖放手势发生的位置。 有关详细信息,请参阅识别拖放手势。
- TapGestureRecognizer 类获得了在 Android 上处理二次点击的能力。 有关详细信息,请参阅识别点击手势。
导航
- Shell 导航获得 GoToAsync 重载,支持将导航发生后被清除的一次性导航数据作为 ShellNavigationQueryParameters 对象传递。 有关详细信息,请参阅传递一次性基于对象的导航数据。
平台集成
- 当应用位于前台时,Geolocation 类可以侦听位置更改。 有关详细信息,请参阅侦听位置更改。
- Flashlight 获得 IsSupportedAsync 方法,用于确定设备上是否有手电筒。 有关详细信息,请参阅手电筒。
- 所有平台已统一 SensorSpeed 间隔。 有关详细信息,请参阅访问设备传感器。
- Permissions 类获得 Permissions.Bluetooth 权限,这是用于查找蓝牙设备的 Android 12 权限,使当前设备可供其他蓝牙设备发现,并与已配对的蓝牙设备通信。 有关详细信息,请参阅 权限。
- Permissions 类获得 Permissions.NearbyWifiDevices 权限,这是用于访问附近 WiFi 设备的 Android 13 权限。 有关详细信息,请参阅 权限。
XAML
- 可以在 XAML 类上指定
x:ClassModifier
特性,以控制程序集中生成的类的访问级别。 有关详细信息,请参阅类修饰符。 - ResourceDictionary 中定义的资源也可以在通过
DynamicResource
标记扩展在AppThemeBinding
中使用。 有关详细信息,请参阅定义和使用主题资源。 - Color 是 SolidColorBrush 类的
ContentProperty
,因此无需通过 XAML 显式设置。
故障排除
- 为了进行故障排除,可以禁用资源生成。 有关更多信息,请参阅禁用图像打包、禁用初始屏幕打包、禁用字体打包和禁用资产文件打包。
- 为了进行故障排除,可以生成空白的初始屏幕。 有关详细信息,请参阅生成空白初始屏幕。
- Resizeter 检查重复图像文件名。 有关详细信息,请参阅重复图像文件名错误。
杂项
- 窗口管理可以与
App
类分离。 有关详细信息,请参阅从应用类分离窗口管理。 - 可以在 Android 应用中轻松使用多种系统字体。 有关详细信息,请参阅使用字体。
- 在 iOS 上,
MauiUIApplicationDelegate
获取可以通过iOSLifecycle.PerformFetch
委托重写或使用的PerformFetch
方法。 有关详细信息,请参阅 iOS 和 Mac Catalyst 平台生命周期事件。
类型弃用和删除
已弃用以下类型或成员:
- ClickGestureRecognizer 已弃用。
- 已弃用
AutomationProperties.Name
、AutomationProperties.HelpText
和AutomationProperties.LabeledBy
附加属性。 - 已弃用 FocusChangeRequested。 请改用 Focus() 方法尝试在视图上设置焦点。
已删除以下类型或成员:
- 已删除
Application.Properties
属性和Application.SavePropertiesAsync
方法。 要将应用属性数据迁移到 .NET MAUI,请参阅将数据从 Xamarin.Forms 应用属性字典迁移到 .NET MAUI 首选项。 PhoneDialer.Current
属性已被删除。 请改用PhoneDialer.Default
。OpenGLView
已删除。
行为变更
与上一版本相比,已更改以下行为:
- 现在,使用 XAML 中的 Map 控件需要以下
xmlns
命名空间声明:xmlns:maps="http://schemas.microsoft.com/dotnet/2021/maui/maps"
。 - 在 Android 上使用
ImageSource.FromStream
方法从流加载图像时禁用图像缓存。 这是由于缺少用于创建合理缓存密钥的数据。 - 在 iOS 上,当软输入键盘覆盖文本输入字段时,页面会自动滚动,以便该字段位于软输入键盘上方。 可以调用
Microsoft.Maui.Platform
命名空间中的KeyboardAutoManagerScroll.Disconnect
方法来禁用此默认行为。 在禁用该行为后,可以调用KeyboardAutoManagerScroll.Connect
方法来重新启用该行为。 - 在 Shell 应用中设置选项卡颜色的方式在某些平台上有所变化。 有关详细信息,请参阅选项卡外观。
- 无需在应用的项目文件中指定
$(ApplicationIdGuid)
生成属性的值。 这是因为 .NET MAUI Windows 应用不再需要 GUID 作为应用 ID,而是使用$(ApplicationId)
生成属性的值作为应用 ID。 因此,现在所有平台都使用相同的反向域名格式应用 ID,例如 com.mycompany.myapp。 - .NET MAUI Mac Catalyst 应用不再有菜单栏上 50 个菜单项的限制。
- 现在可以使用
Microsoft.Maui.Graphics
命名空间中的PlatformImage.FromStream
方法在 Windows 上加载图像,而无需使用W2DImageLoadingService
类。 - 在 Android 上,动画会遵循系统动画设置。 有关详细信息,请参阅基本动画。
性能
.NET MAUI 8 在性能方面有很多变化。 这些变化可分为五个方面:
- 新增功能
- 生成和内部循环性能
- 性能或应用大小改进
- .NET MAUI 中的结构和
IEquatable
- 修复
{AppThemeBinding}
中的性能问题 - 解决
CA1307
和CA1309
问题,以提升性能 - 解决
CA1311
问题以提升性能 - 在 Android 上移除未使用的
ViewAttachedToWindow
事件 - 为
{Binding}
移除不需要的System.Reflection
- 将
StringComparer.Ordinal
用于Dictionary
和HashSet
- 减少 Android 上
MauiDrawable
中的 Java 互操作 - 提高
Label
在 Android 上的布局性能 - 减少 .NET MAUI 中控件的 Java 互操作调用
- 提高
Entry.MaxLength
在 Android 上的性能 - 改善 Windows 上
CollectionView
的内存使用情况 - 在 Apple 平台上使用
UnmanagedCallersOnlyAttribute
- 在 Android 上加快字符串的 Java 互操作
- 在 Android 上加快 C# 事件的 Java 互操作
- 在 JNI 中使用函数指针
- 已移除
Xamarin.AndroidX.Legacy.Support.V4
- 在 iOS 和 macOS 上删除泛型重复数据
- 修复
System.Linq.Expressions
在 iOS 类平台上的实现问题 - 为 iOS 和 Catalyst 设置
DynamicCodeSupport=false
- .NET MAUI 中的结构和
- 内存泄漏
- 工具和文档
有关详细信息,请参阅 .NET MAUI 中的 .NET 8 性能改进。
从 .NET 7 升级到 .NET 8
要将项目从 .NET 7 升级到 .NET 8,请使用 Visual Studio 17.8+ 或者使用独立安装程序和 dotnet workload install maui
命令安装 .NET MAUI 工作负载。
然后,打开 .csproj 文件,并将 Target Framework Monikers (TFM) 从 7 更改为 8。 如果使用 TFM,例如 net7.0-ios13.6
,请确保匹配平台版本或将其整个删除。 以下示例显示了 .NET 7 项目的 TFM:
<TargetFrameworks>net7.0-android;net7.0-ios;net7.0-maccatalyst;net7.0-tizen</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>
以下示例显示了 .NET 8 项目的 TFM:
<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst;net8.0-tizen</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>
还应将以下 .NET MAUI NuGet 包的显式包引用添加到 .csproj 文件中:
<ItemGroup>
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
</ItemGroup>
$(MauiVersion)
变量是从已安装的 .NET MAUI 版本引用的。 可以通过将 $(MauiVersion)
生成属性添加到 .csproj 文件来替代此值:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
<UseMaui>True</UseMaui>
<MauiVersion>8.0.3</MauiVersion>
</PropertyGroup>
</Project>
使用来自夜间订阅源的临时生成或从拉取请求下载的版本时,这非常有用。
此外,可以从 .NET 8 中的 .csproj 文件中删除 $(ApplicationIdGuid)
生成属性。 有关详细信息,请参阅行为变更。
在首次生成升级的应用之前,请先删除 bin
和 obj
文件夹。
注意
.NET 8 中 .NET MAUI 应用的项目模板为具有 $(Nullable)
生成属性的项目启用可为 null 的上下文。 有关详细信息,请参阅可为 null。