.NET MAUI 在 .NET 8 中的重点是质量。 在 .NET 8 中,合并了 1618 个拉取请求,关闭了 689 个问题。 其中包括来自 .NET MAUI 团队和 .NET MAUI 社区的更改。 这些更改应导致 .NET 8 的质量显著增加。
重要
由于使用基础外部依赖项(如 Xcode 或 Android SDK 工具),.NET 多平台应用 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事件。 有关详细信息,请参阅 “识别指针手势”。
- PointerEventArgs对象,伴随由PointerGestureRecognizer类引发的指针事件,添加了PlatformArgs类型的PlatformPointerEventArgs属性。 此属性提供对指针手势事件的特定于平台的参数的访问权限。 有关详细信息,请参阅 “识别指针手势”。
- 拖放手势事件的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特性,以控制程序集中生成的类的访问级别。 有关详细信息,请参阅 类修饰符。 - 可以通过
DynamicResource标记扩展在AppThemeBinding中使用ResourceDictionary中定义的资源。 有关详细信息,请参阅 “定义和使用主题资源”。 -
Color 是 SolidColorBrush 类的
ContentProperty,因此不需要从 XAML 显式设置。
故障排除
- 出于故障排除目的,可以禁用资源生成。 有关详细信息,请参阅 “禁用图像打包”、“ 禁用初始屏幕打包”、“ 禁用字体打包”和 “禁用资产文件打包”。
- 出于故障排除目的,可以生成空白的初始屏幕。 有关详细信息,请参阅 “生成空白初始屏幕”。
- Resizeter 检查重复的图像文件名。 有关详细信息,请参阅 重复图像文件名错误。
其他
- 可以将窗口管理与
App类分离。 有关详细信息,请参阅 从 App 类分离窗口管理。 - Android 应用中可以轻松使用多个系统字体。 有关详细信息,请参阅 “使用字体”。
- 在 iOS 上,
MauiUIApplicationDelegate获得了一个 方法,可以通过 委托重写或使用。 有关详细信息,请参阅 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" - 使用
ImageSource.FromStream方法从流加载图像时,Android 上禁用了图像缓存。 这是因为缺少用于创建合理缓存密钥的数据。 - 在 iOS 上,当软输入键盘覆盖文本输入字段时,页面会自动滚动,以便该字段位于软输入键盘上方。 可以调用
KeyboardAutoManagerScroll.Disconnect命名空间中的Microsoft.Maui.Platform方法来禁用此默认行为。 在禁用该行为后,可以调用KeyboardAutoManagerScroll.Connect方法来重新启用该行为。 - 在 Shell 应用中设置选项卡的颜色在某些平台上发生了变化。 有关详细信息,请参阅 Tab 外观。
- 无需为
$(ApplicationIdGuid)应用的项目文件中的生成属性指定值。 这是因为 .NET MAUI Windows 应用不再需要 GUID 作为应用 ID,而是使用生成属性的值$(ApplicationId)作为应用 ID。 因此,现在在所有平台上使用相同的反向域格式应用 ID,例如 com.mycompany.myapp。 - .NET MAUI Mac Catalyst 应用不再局限于菜单栏上的 50 个菜单项。
-
PlatformImage.FromStream方法位于Microsoft.Maui.Graphics命名空间中,现在可以用于在 Windows 上加载图像,无需使用W2DImageLoadingService类。 - 在 Android 上,动画尊重系统动画设置。 欲了解更多信息,请参见基础动画。
- 启用
<UseMaui>true</UseMaui>中央包管理(CPM)后,项目属性不再自动包含所需的 NuGet 包。
性能
.NET MAUI 8 中有很多性能变化。 这些更改可以分为五个方面:
- 新功能
- 构建和内部循环效率
- 性能或应用大小改进
-
结构,在
IEquatable.NET MAUI 中 -
修复
{AppThemeBinding}中的性能问题 -
解决
CA1307和性能CA1309问题 -
性能地址
CA1311 -
在 Android 上删除未使用
ViewAttachedToWindow的事件 -
删除不需要的
System.Reflection{Binding} -
用于
StringComparer.OrdinalDictionary和HashSet -
减少 Android 上的 Java 互操作
MauiDrawable -
提高 Android 上的布局性能
Label - 减少 .NET MAUI 中控件的 Java 互作调用
-
提高 Android 性能
Entry.MaxLength -
提高 Windows 上的内存使用率
CollectionView -
在 Apple 平台上使用
UnmanagedCallersOnlyAttribute - 提高 Android 上字符串的 Java 互操作性速度
- 适用于 Android 上的 C# 事件的 Java 互作速度更快
- 使用 JNI 的函数指针
-
删除
Xamarin.AndroidX.Legacy.Support.V4 - iOS 和 macOS 上的泛型去重
-
修复
System.Linq.ExpressionsiOS 类平台上的实现 -
为 iOS 和 Catalyst 设置
DynamicCodeSupport=false
-
结构,在
- 内存泄漏
- 工具和文档
有关详细信息,请参阅 .NET MAUI 中的 .NET 8 性能改进。
从 .NET 7 升级到 .NET 8
若要将项目从 .NET 7 升级到 .NET 8,请使用 Visual Studio 17.8+ 或 独立安装程序 和 dotnet workload install maui 命令安装 .NET MAUI 工作负载。
然后,打开 .csproj 文件,并将目标框架标识符(TFMs)从 7 更改为 8。 如果使用 TFM,例如 net7.0-ios13.6,请确保匹配平台版本或将其整个删除。 以下示例显示了 .NET 7 项目的 TPM:
<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>
使用 中央包管理(CPM)时,不再自动引用 .NET MAUI 包,必须显式添加。 对于仅包含资产(MauiImage、MauiAsset等)的项目,添加Microsoft.Maui.Resizetizer包(而不是Microsoft.Maui.Controls)就足够了。
变量 $(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) 生成属性为项目启用了可为空的上下文。 有关详细信息,请参阅 Nullable。