适用于 .NET 8 的 .NET MAUI 中的新增功能

.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 以质量为重点,但也引入了一些新功能,可以在应用程序中实现新的使用场景。

控件

桌面

手势识别器

平台集成

XAML

故障排除

其他

类型弃用和删除

已弃用以下类型或成员:

已删除以下类型或成员:

行为变更

从上一版本起,以下特性已更改:

  • 使用 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 中有很多性能变化。 这些更改可以分为五个方面:

有关详细信息,请参阅 .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 包,必须显式添加。 对于仅包含资产(MauiImageMauiAsset等)的项目,添加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) 生成属性。 有关详细信息,请参阅 行为更改

在首次生成升级的应用之前,请先删除 binobj 文件夹。

注释

项目模板在 .NET 8 中用于 .NET MAUI 应用,并通过 $(Nullable) 生成属性为项目启用了可为空的上下文。 有关详细信息,请参阅 Nullable

另请参阅