.NET Multi-platform App UI (.NET MAUI) 单一项目将开发应用时常见的特定于平台的体验融合起来,整合为面向 Android、iOS、macOS 和 Windows 的单一共享项目。无论面向哪个平台,它都提供简化且一致的跨平台开发体验,主要功能包括:一个可面向 Android、iOS、macOS、Tizen 和 Windows 的共享项目;简化的调试目标选择;单一项目中的共享资源文件;指定应用标题、ID 和版本的单一应用清单;根据需要访问特定于平台的 API 和工具;以及单个跨平台应用入口点。.NET MAUI 单一项目是利用多目标方法实现的,并且使用了 SDK 样式项目。
资源文件
跨平台应用开发的资源管理长期存在挑战,因为每个平台都有自己的资源管理方法。例如,图像通常需要为不同分辨率创建多个版本,并在各平台使用不同的文件名和文件夹约定。.NET MAUI 单一项目允许资源文件存储在单个位置,同时在每个平台上使用,包括字体、图像、应用图标、初始屏幕、原始资产和用于设置应用样式的 CSS 文件。每个图像资源文件都会作为源图像,在生成时针对每个平台生成所需分辨率的图像。注意:.NET MAUI 单一项目中目前不支持 iOS 资产目录。
资源文件通常应放置在 .NET MAUI 应用项目的 Resources 文件夹或其子文件夹中,并且必须正确设置生成操作。下表列出了每种资源文件类型的生成操作:
| 资源类型 | 生成操作 |
|---|---|
| 应用图标 | MauiIcon |
| 字体 | MauiFont |
| 图像 | MauiImage |
| 初始屏幕 | MauiSplashScreen |
| 原始资产 | MauiAsset |
| CSS 文件 | MauiCss |
注意:XAML 文件也存储在 .NET MAUI 应用项目中,并会在创建项目和项模板时自动分配 MauiXaml 生成操作,但通常只将 XAML 资源字典放置在 Resources 文件夹中。
将资源文件添加到应用项目时,会在项目文件中创建相应条目(CSS 文件除外)。可以通过编辑项目文件为每种资源类型指定 Resources 文件夹的子文件夹,例如:
<ItemGroup>
<!-- Images -->
<MauiImage Include="Resources\Images\*" />
<!-- Fonts -->
<MauiFont Include="Resources\Fonts\*" />
<!-- Raw assets -->
<MauiAsset Include="Resources\Raw\*" />
</ItemGroup>
使用通配符字符(*)可将文件夹中的所有文件视为指定资源类型。此外,还可以包含子文件夹中的所有文件,例如使用双通配符(**)指定 Images 文件夹及其子文件夹。
特定于平台的资源将替代共享资源。例如,如果在 Platforms\Android\Resources\drawable-xhdpi\logo.png 中有特定于 Android 的图像,并提供了共享的 Resources\Images\logo.svg 图像,则 SVG 文件将生成所需的 Android 图像,但已存在的平台特定 XHDPI 图像除外。
应用图标
将图像拖动到 Resources\AppIcon 文件夹即可添加应用图标,生成操作自动设置为 MauiIcon。在生成时,应用图标会针对目标平台和设备调整大小,并添加到应用包中,用于多种用途如设备图标和应用商店。详细信息请参考相关文档。
图像
将图像拖到 Resources\Images 文件夹可添加图像,生成操作自动设置为 MauiImage。生成时,图像大小会调整为目标平台和设备的正确分辨率,然后添加到应用包。
字体
将 True Type 格式字体 (TTF) 或 Open Type (OTF) 字体拖动到 Resources\Fonts 文件夹可添加字体,生成操作自动设置为 MauiFont。生成时,字体会复制到应用包。
初始屏幕
将图像拖动到 Resources\Splash 文件夹可添加初始屏幕,生成操作自动设置为 MauiSplashScreen。生成时,初始屏幕图像会调整为适合目标平台和设备的大小,并添加到应用包。
原始资产
将原始资产文件如 HTML、JSON 和视频拖动到 Resources\Raw 文件夹可添加资产,生成操作自动设置为 MauiAsset。控件可以根据需要使用原始资产,例如 <WebView Source="index.html" />。生成时,原始资产会复制到应用包,有关禁用资产打包的信息请参考故障排除文档。
CSS 文件
可以使用级联样式表 (CSS) 文件对 .NET MAUI 应用进行样式设置。将 CSS 文件拖动到项目文件夹,并在属性窗口中将生成操作设置为 MauiCss 即可添加。CSS 文件必须由 StyleSheet 类加载后才能添加到 ResourceDictionary,例如:
<Application ...>
<Application.Resources>
<StyleSheet Source="/Resources/styles.css" />
</Application.Resources>
</Application>
应用部件清单
每个平台都使用本机应用清单文件指定应用标题、ID、版本等信息。.NET MAUI 单一项目支持在项目文件中的单一位置指定这些常见数据。要指定共享应用清单数据,在解决方案资源管理器中打开项目属性,然后在“MAUI 共享”>“常规”中设置应用标题、ID 和版本。生成时,共享数据与本机清单文件中的特定于平台数据合并,生成应用包的清单文件。
特定于平台的代码
.NET MAUI 应用项目包含一个 Platforms 文件夹,每个子文件夹表示一个可面向的平台,如 Android、iOS、macOS 和 Windows。这些文件夹包含特定于平台的资源和启动代码。生成时,生成系统仅包含针对特定平台的文件夹中的代码。例如,为 Android 生成时,只包含 Platforms\Android 中的文件。此方法使用多目标从单个项目面向多个平台,可以与分部类和分部方法结合调用本机平台功能。
除了默认多目标方法,.NET MAUI 应用还可以基于文件名和文件夹条件进行多目标化,允许不将平台代码放入 Platforms 文件夹。还可以将多目标与条件编译结合,使代码面向特定平台,例如:
#if ANDROID
handler.PlatformView.SetBackgroundColor(Colors.Red.ToPlatform());
#elif IOS
handler.PlatformView.BackgroundColor = Colors.Red.ToPlatform();
handler.PlatformView.BorderStyle = UIKit.UITextBorderStyle.Line;
#elif WINDOWS
handler.PlatformView.Background = Colors.Red.ToPlatform();
#endif
应用入口点
虽然 Platforms 文件夹包含每个平台的启动代码,但 .NET MAUI 应用有一个单一跨平台应用入口点。每个平台入口点调用应用项目中静态 MauiProgram 类的 CreateMauiApp 方法,返回 MauiApp 作为应用入口点。
MauiProgram 类必须至少提供一个要运行的应用,例如:
namespace MyMauiApp;
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder.UseMauiApp<App>();
return builder.Build();
}
}
App 类派生自 Application 类,例如:
namespace MyMauiApp;
public class App : Application
{
public App()
{
InitializeComponent();
MainPage = new AppShell();
}
}
在前例中,MainPage 属性设置为 AppShell 对象,即描述应用视觉层次结构的子类化 Shell 类。或者,可以通过重写 CreateWindow 方法设置初始内容:
namespace MyMauiApp;
public class App : Application
{
public App()
{
InitializeComponent();
}
protected override Window CreateWindow(IActivationState? activationState)
{
return new Window(new AppShell());
}
}