.NET MAUI亮点详细介绍—— 一个代码库,多种平台

815 阅读11分钟

欢迎来到.NET多平台应用程序用户界面。这个版本标志着我们在统一.NET平台的多年旅程中的一个新里程碑。现在,你和其他500多万名.NET开发人员有了一个一流的、针对Android、iOS、macOS和Windows的跨平台UI栈,以补充.NET工具链(SDK)和基础类库(BCL)。你可以用.NET构建任何东西。

微软Build 2022大会上,我们将为您介绍用.NET和Visual Studio为任何设备构建本地应用程序的所有更新。

这仅仅是我们创造令.NET开发者满意的桌面和移动应用体验之旅的开始。对于下一阶段,现在已经为更广泛的.NET生态系统建立了基础,将插件、库和服务从.NET框架和旧的项目系统带到.NET 6和SDK风格的项目。今天可用的有

syncfusion controls for dot net mauitelerik controls for dot net maui
DevExpress controls for dot net mauigrial kit controls for .NET MAUI
AndroidX
AlohaKit
CommunityToolkit.MVVM
CommunityToolkit.Maui
CommunityToolkit MauiCompat
CommunityToolkit Markup.MauiCompat
DevExpress
Facebook
FreshMvvm.Maui
Google APIs for iOS
Google Play Services Client Libraries
GrialKit
MauiAnimation
Microsoft.Maui.Graphics
MR.Gestures
Prism.Maui
Plugin.Fingerprint
Plugin.InAppBilling
Plugin.StoreReview
Plugin.ValidationRules
ReactiveUI.Maui
Shiny
SkiaSharp
Syncfusion
Telerik UI for .NET MAUI
TemplateUI
User Dialogs

关于将库转移到.NET 6的帮助,请查看Michael Rumpler(MR.Gestures)和Luis Matos(Plugin.ValidationRules)最近发表的客座博文,详细介绍了运送.NET MAUI库的经验。

当前18个月的发布计划中,.NET MAUI工作负载得到了充分支持,并将以与.NET相同的月度节奏提供服务。我们对.NET MAUI的持续关注仍然是质量,解决已知的问题,并根据你的反馈优先处理问题。这也包括我们为构建专门针对Android、Android Wear、CarPlay、iOS、macOS和tvOS的应用程序而交付的工作负载,这些应用程序直接使用.NET的本地工具包以及支持库AndroidX、Facebook、Firebase、Google Play Services和SkiaSharp。

有了.NET MAUI,你可以实现不妥协的用户体验,同时比以往分享更多的代码。.NET MAUI通过每个平台提供的主要应用工具包、现代开发人员的生产力和我们最快的移动平台使用本地UI。

原生用户界面,不做任何改变

.NET MAUI的主要目标是使您能够提供每个平台(Android、iOS、macOS、Windows和Tizen,由于与三星的合作)专门设计的最佳应用体验,同时使您能够通过丰富的风格和图形制作一致的品牌体验。开箱即用,每个平台的外观和行为都是它应该有的,不需要任何额外的小部件或造型来模仿。例如,Windows上的.NET MAUI是由WinUI 3支持的,它是与Windows App SDK一起提供的主要本地UI组件。

app UI on all four supported platforms

使用C#和XAML,从40多个控件、布局和页面的丰富工具包中构建你的应用程序。在Xamarin移动控件的肩膀上,.NET MAUI增加了对多窗口桌面应用程序、菜单栏和新的动画功能、边框、角、阴影、图形等的支持。哦,还有新的BlazorWebView ,我将在下面强调。

Image controls sample png

在.NET MAUI文档中阅读更多关于控件:页面、布局和视图

可访问性第一

使用本地用户界面的一个主要优势是继承了对可访问性的支持,我们可以通过语义服务来建立这种支持,从而使创建高度可访问的应用程序比以往任何时候都更容易。我们已经与客户密切合作,重新设计我们的可访问性开发方式。从这些对话中,我们设计了用于控制的.NET MAUI语义服务

  • 属性,如描述、提示和标题级别
  • 焦点
  • 屏幕阅读器
  • 自动化属性

在.NET MAUI文档中阅读更多关于可访问性语义服务的内容。

超越用户界面

.NET MAUI提供了简单的API来访问每个平台的服务和功能,如加速度计、应用程序动作、文件系统、通知等等。在这个例子中,我们配置了 "应用程序动作",在每个平台的应用程序图标上添加菜单选项:

AppActions.SetAsync(
    new AppAction("current_info", "Check Current Weather", icon: "current_info"),
    new AppAction("add_location", "Add a Location", icon: "add_location")
);

Image platform integrations png

阅读更多关于访问平台服务和功能的.NET MAUI文档。

易于定制

无论你是扩展.NET MAUI控件的功能还是建立新的平台功能,.NET MAUI都是为可扩展性而设计的,所以你永远不会碰壁。以Entry 控件为例,这是一个典型的控件例子,它在一个平台上的显示效果是不同的。Android在文本字段下面画了一个下划线,而开发者经常想删除这个下划线。有了.NET MAUI,定制整个项目中的每一个Entry ,只需要几行代码:

#if ANDROID
Microsoft.Maui.Handlers.EntryHandler.Mapper.ModifyMapping("NoUnderline", (h, v) =>
{
    h.PlatformView.BackgroundTintList = ColorStateList.ValueOf(Colors.Transparent.ToPlatform());
});
#endif

android default entry control compared to a styled entry control

下面是Cayas软件公司最近创建新地图平台控件的一个很好的例子。这篇博文演示了为该控件创建一个处理程序,为每个平台实现,然后通过在.NET MAUI中注册使该控件可用:

.ConfigureMauiHandlers(handlers =>
{
    handlers.AddHandler(typeof(MapHandlerDemo.Maps.Map),typeof(MapHandler));
})

Image maui maps png

在.NET MAUI文档中阅读更多关于用处理程序定制控件的内容

现代开发者的生产力

不仅是一种可以构建任何东西的技术,我们还希望.NET也能利用通用语言特性、模式和实践以及工具来加速你的生产力。

.NET MAUI使用了在.NET 6中引入的新的C# 10特性,包括全局使用语句和文件范围命名空间--这对于减少文件中的杂乱无章的内容非常有利。.NET MAUI以 "单一项目 "为重点,将多目标提高到一个新水平。

Image code side by side png

在新的.NET MAUI项目中,平台被安置在一个子文件夹中,使你的应用程序集中在你的大部分工作中。在你的项目的资源文件夹中,你有一个单一的地方来管理你的应用程序的字体图像应用程序图标闪屏、原始资产和造型。.NET MAUI会根据每个平台的独特要求来优化它们。

solution explorer showing platform and resources folders

多项目与单项目用每个平台的单独项目来构造你的解决方案仍然受到支持,所以你可以选择什么时候单项目方法适合你的应用程序。

.NET MAUI使用在ASP.NET和Blazor应用程序中的Microsoft.Extensions库中流行的构建器模式,作为初始化和配置应用程序的单一场所。在这里,你可以向.NET MAUI提供你的字体,利用平台特定的生命周期事件,配置依赖关系,启用特定的功能,启用供应商控制工具包,等等。

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureServices()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("Segoe-Ui-Bold.ttf", "SegoeUiBold");
                fonts.AddFont("Segoe-Ui-Regular.ttf", "SegoeUiRegular");
                fonts.AddFont("Segoe-Ui-Semibold.ttf", "SegoeUiSemibold");
                fonts.AddFont("Segoe-Ui-Semilight.ttf", "SegoeUiSemilight");
            });

        return builder.Build();
    }
}
public static class ServicesExtensions
{
    public static MauiAppBuilder ConfigureServices(this MauiAppBuilder builder)
    {
        builder.Services.AddMauiBlazorWebView();
        builder.Services.AddSingleton<SubscriptionsService>();
        builder.Services.AddSingleton<ShowsService>();
        builder.Services.AddSingleton<ListenLaterService>();
#if WINDOWS
        builder.Services.TryAddSingleton<SharedMauiLib.INativeAudioService, SharedMauiLib.Platforms.Windows.NativeAudioService>();
#elif ANDROID
        builder.Services.TryAddSingleton<SharedMauiLib.INativeAudioService, SharedMauiLib.Platforms.Android.NativeAudioService>();
#elif MACCATALYST
        builder.Services.TryAddSingleton<SharedMauiLib.INativeAudioService, SharedMauiLib.Platforms.MacCatalyst.NativeAudioService>();
        builder.Services.TryAddSingleton< Platforms.MacCatalyst.ConnectivityService>();
#elif IOS
        builder.Services.TryAddSingleton<SharedMauiLib.INativeAudioService, SharedMauiLib.Platforms.iOS.NativeAudioService>();
#endif

        builder.Services.TryAddTransient<WifiOptionsService>();
        builder.Services.TryAddSingleton<PlayerService>();

        builder.Services.AddScoped<ThemeInterop>();
        builder.Services.AddScoped<ClipboardInterop>();
        builder.Services.AddScoped<ListenTogetherHubClient>(_ =>
            new ListenTogetherHubClient(Config.ListenTogetherUrl));


        return builder;
    }
}

在.NET MAUI文档中阅读更多关于用MauiProgram单一项目 启动应用程序的内容。

将Blazor带入桌面和移动领域

.NET MAUI对于希望通过本地客户端应用程序参与行动的网络开发人员来说也是非常好的。.NET MAUI与Blazor集成,因此您可以在本地移动和桌面应用程序中直接重用现有的Blazor网页用户界面组件。有了.NET MAUI和Blazor,您可以重新利用您的网络开发技能来构建跨平台的本地客户端应用程序,并构建一个跨越移动、桌面和网络的单一用户界面。

.NET MAUI Blazor on mobile, desktop, and web

.NET MAUI在设备上原生地执行您的Blazor组件(不需要WebAssembly),并将其渲染成一个嵌入式Web视图控件。由于您的Blazor组件是在.NET过程中编译和执行的,因此它们并不局限于网络平台,可以利用任何本地平台的功能,如通知、蓝牙、地理位置和传感器、文件系统等等。你甚至可以在你的Blazor网络用户界面旁边添加本地UI控件。这是一种全新的混合应用。Blazor混合型

开始使用.NET MAUI和Blazor很容易:只需使用附带的.NET MAUI Blazor应用项目模板。

.NET MAUI Blazor app template

该模板已全部设置完毕,您可以开始使用HTML、CSS和C#构建一个.NET MAUI Blazor应用程序。.NET MAUI的Blazor混合教程将指导您构建和运行您的第一个.NET MAUI Blazor应用程序。

或者在你想开始使用Blazor组件的地方,向现有的.NET MAUI应用添加一个BlazorWebView 控件

<BlazorWebView HostPage="wwwroot/index.html">
    <BlazorWebView.RootComponents>
        <RootComponent Selector="#app" ComponentType="{x:Type my:Counter}" />
    </BlazorWebView.RootComponents>
</BlazorWebView>

Blazor Hybrid支持现在也可用于WPF和Windows Forms,因此您可以开始对现有的桌面应用程序进行现代化改造,使其在网络上运行或与.NET MAUI跨平台运行。用于WPF和Windows Forms的BlazorWebView 控件在NuGet上可用。请查看用于WPFWindows Forms的Blazor Hybrid教程,了解如何开始使用。

要了解更多关于Blazor Hybrid对.NET MAUI、WPF和Windows Forms的支持,请查看Blazor Hybrid文档

速度优化

.NET MAUI是为性能而设计的。你已经告诉我们,你的应用程序尽可能快地启动是多么重要,特别是在Android上。.NET MAUI中的UI控件在本地平台控件上实现了一个薄的、解耦的处理程序-映射模式。这减少了UI渲染的层数,简化了控件的定制。

.NET MAUI中的布局已被设计为使用一致的管理器模式,它优化了测量和排列循环,以更快地渲染和更新你的用户界面。我们还为特定的场景浮现了预先优化的布局,如除了HorizontalStackLayoutVerticalStackLayout ,还有StackLayout

从这个旅程的一开始,我们就设定了一个目标,即在过渡到.NET 6时,提高启动性能并保持或减少应用程序的大小。在GA的时候,我们已经实现了.NET MAUI的34.9%的改进和.NET for Android的39.4%的改进。这些改进也延伸到了复杂的应用程序;.NET播客样本应用程序开始时的启动时间为1299ms,而在GA测量时为814.2ms,比Preview 13改进了37.3%。

这些设置是默认启用的,以提供一个具有这些优化的发布版本。

Image android release settings

敬请关注我们为实现这些结果所做的深入研究的博文。

今天就开始吧

要开始在Windows上使用.NET MAUI,请安装或更新Visual Studio 2022 Preview到17.3 Preview 1.1版本。在安装程序中,选择".NET多平台应用程序用户界面开发 "的工作内容。

dot net maui workload in visual studio installer

要在Mac上使用.NET MAUI,请安装新的Visual Studio 2022Preview for Mac(17.3 Preview 1)。

Visual Studio 2022将在今年晚些时候支持.NET MAUI工具。今天在Windows上,你可以通过XAML和.NET Hot Reload以及强大的XAML、C#、Razor和CSS等编辑器加速你的开发循环。使用XAML实时预览和实时视觉树,你可以预览、对齐、检查你的用户界面,并在调试时对其进行编辑。.NET MAUI的新的单一项目体验现在包括项目属性页,用于可视化编辑体验,以配置你的应用程序的多平台目标。

在Mac上,你现在可以加载单项目和多项目的.NET MAUI解决方案,用漂亮的、新的原生Visual Studio 2022 for Mac体验进行调试。其他用于提高开发.NET MAUI应用程序效率的功能将在随后的预览版中推出。

我们建议今天就开始更新你的库到.NET MAUI,并创建新的.NET MAUI项目。在一头扎进将Xamarin项目转换为.NET MAUI之前,请审查你的依赖关系、Visual Studio对.NET MAUI的支持状况以及已发布的已知问题,以确定正确的过渡时机。请记住,Xamarin将在现代生命周期政策下继续得到支持,该政策规定从最后一个主要版本起两年内。

资源

我们需要你的反馈

我们很乐意听到你的意见!如果你遇到了任何问题,请在GitHub上提交报告,地址是dotnet/maui

摘要

有了.NET MAUI,你可以使用整个.NET的相同生产力模式,从一个代码库为Android、iOS、macOS、Tizen和Windows构建本地应用程序。.NET MAUI的薄型和解耦UI和布局架构以及单一项目功能使您能够专注于一个应用程序,而不是在多个平台的独特需求上打转。通过.NET 6,我们不仅为Android,而且为所有的平台目标提供了性能改进。

更少的平台代码,更多的共享代码,一致的标准和模式,轻量级和高性能的架构,移动和桌面原生体验--这只是一个开始。我们期待着在接下来的几个月里看到库和更广泛的生态系统与.NET MAUI一起,为.NET开发人员定义一个跨平台应用开发的新时代,使你和你的组织能够实现更多。