官宣 MAUI 在.NET Preview 3的最新進展

我們在.NET 6 Preview 3中交付了.NET多平台應用UI的移動和桌面開發的最新進展。此版本添加了Windows平台和WinUI 3,改進了基本應用程序和啟動構建器,添加了原生生命周期事件,並添加了更多UI控件和布局。我們還為輔助功能引入了一些新的語義屬性。當我們對這些進行詳細探討時,我們邀請您與我們一起使用dotnet new創建新應用,並分享您的反饋。

支持Windows桌面

Project Reunion 0.5已發佈!現在,Windows加入了Android,iOS和macOS,成為您可以使用.NET MAUI到達的目標平台!您可以從Project Reunion安裝說明開始體驗。在這個版本中,我們創建了一個示例項目,您可以從Visual Studio 2019 16.10 Preview中開始探索。

1.png

一旦有了用於Project Reunion的必要的.NET 6基礎構建架構,我們就會將Windows添加到我們的單項目模板中。

入門

由於我們仍處於預覽的早期階段,因此安裝移動和桌面開發所需的所有依賴項的過程還是依賴於手動操作。為了幫助您和我們自己,喬納森·迪克(Jonathan Dick)整理了一個有用的工具dotnet tool,它可以評估您的系統並儘可能多地收集所需的組件。使用這個工具需要從命令行全局安裝maui-check
dotnet tool install -g Redth.Net.Maui.Check

源://github.com/Redth/dotnet-maui-check

2.png

現在運行> maui-check並按照說明進行操作。成功之後,就可以創建您的第一個應用程序了:
dotnet new maui -n HelloMaui

有關安裝和入門的分步說明,也可以參考:
//github.com/dotnet/maui/wiki/Getting-Started

您的第一個應用程序

.NET MAUI使用Microsoft.Extensions HostBuilder啟動每個應用程序。這為應用程序開發人員和庫維護人員提供了一致的模式,以便快速開發應用程序。每個平台都有不同的起始點,但是您的應用程序入口一致位於Startup.cs。這裡有個簡單例子:

public class Startup : IStartup 
{ 
    public void Configure(IAppHostBuilder appBuilder) 
    { 
        appBuilder 
            .UseMauiApp(); 
    } 
}

在這裡,您可以執行諸如註冊字體和註冊Xamarin.Forms渲染器或自定義渲染器兼容性的操作。這也是您引入您的App的地方,即實現Application並(至少)負責創建一個新的Window:

public partial class App : Application 
{ 
    public override IWindow CreateWindow(IActivationState activationState) 
    { 
        return new MainWindow(); 
    } 
} 

為了呈現您的內容,一個視圖會被添加到MainWindow:

public class MainWindow : IWindow 
{ 
    public MainWindow() 
    { 
        Page = new MainPage(); 
    } 

    public IPage Page { get; set; } 
 
    public IMauiContext MauiContext { get; set; } 
} 

就是這樣!您現在就擁有了一個有內容的窗口。

原生生命周期事件

Preview 3進一步完善了啟動擴展程序,引入了ConfigureLifecycleEvents以便於輕鬆連接到原生平台生命周期事件上。這是一個重要的介紹,尤其是對於單項目體驗,它可以簡化許多庫所需的初始化和配置。

以下是一個簡單的例子,將程序關聯到Android後退按鈕事件並根據需要進行處理:

public class Startup : IStartup 
{ 
    public void Configure(IAppHostBuilder appBuilder) 
    { 
        appBuilder 
            .UseMauiApp() 
            .ConfigureLifecycleEvents(lifecycle => { 
                #if ANDROID 
                lifecycle.AddAndroid(d => { 
                    d.OnBackPressed(activity => { 
                        System.Diagnostics.Debug.WriteLine("Back button pressed!"); 
                    }); 
                }); 
                #endif 
            }); 
    } 
} 

現在讓我們看一下其它庫要如何使用這些方法來簡化其平台初始化工作。Essentials(Microsoft.Maui.Essentials)庫是.NET MAUI的一部分,它提供了跨平台的非UI服務,我們可以利用此庫在統一的位置中配置所有平台所需的所有內容:

public class Startup : IStartup 
{ 
    public void Configure(IAppHostBuilder appBuilder) 
    { 
        appBuilder 
            .UseMauiApp() 
            .ConfigureEssentials(essentials => 
            { 
                essentials 
                    .UseVersionTracking() 
                    .UseMapServiceToken("YOUR-KEY-HERE"); 
            }); 
    } 
} 

在Essentials代碼中,您可以看到ConfigureEssentials擴展方法是如何創建的,以及如何鏈接到平台生命周期事件中,從而大大簡化了跨平台的原生配置。

public static IAppHostBuilder ConfigureEssentials(this IAppHostBuilder builder, Action configureDelegate = null) 
{ 
    builder.ConfigureLifecycleEvents(life => 
    { 
#if __ANDROID__ 
        Platform.Init(MauiApplication.Current); 
 
        life.AddAndroid(android => android 
            .OnRequestPermissionsResult((activity, requestCode, permissions, grantResults) => 
            { 
                Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); 
            }) 
            .OnNewIntent((activity, intent) => 
            { 
                Platform.OnNewIntent(intent); 
            }) 
            .OnResume((activity) => 
            { 
                Platform.OnResume(); 
            })); 
#elif __IOS__ 
        life.AddiOS(ios => ios 
            .ContinueUserActivity((application, userActivity, completionHandler) => 
            { 
                return Platform.ContinueUserActivity(application, userActivity, completionHandler); 
            }) 
            .OpenUrl((application, url, options) => 
            { 
                return Platform.OpenUrl(application, url, options); 
            }) 
            .PerformActionForShortcutItem((application, shortcutItem, completionHandler) => 
            { 
                Platform.PerformActionForShortcutItem(application, shortcutItem, completionHandler); 
            })); 
#elif WINDOWS 
        life.AddWindows(windows => windows 
            .OnLaunched((application, args) => 
            { 
                Platform.OnLaunched(args); 
            })); 
#endif 
    }); 
 
    if (configureDelegate != null) 
        builder.ConfigureServices(configureDelegate); 
 
    return builder; 
} 

您可以在dotnet/maui中查看完整的類。我們期待看到更多的庫利用這種模式來簡化其使用方式。

控件和布局的更新

除了從Xamarin.Forms引入的已有的可兼容的Renderers以外,我們還將繼續在.NET MAUI中增加更多控件,屬性和布局。如果您使用上面的代碼作為啟動程序,那麼您將僅能使用當前已經實現的handlers。要查看當前已實現的內容,可以查看Handlers folder at dotnet/maui

為了跟蹤我們接下來的工作,我們為所有我們已經接受Pull request的handlers提供了一個Project Board, 大家可以查閱。

布局在Preview 3中也進行了一些更新。Grid現在支持絕對大小和自動大小(與內容大小相同)。LayoutAlignment選項現在也可用於Grid和StackLayout,因此您可以開始使用HorizontalLayoutAlignment和VerticalLayoutAlignment屬性來定位視圖。

輔助功能的語義屬性

我們一直在與許多客戶合作,以更好地了解在實現跨多個本機平台的可訪問性方面遇到的常見困難,以及如何使它在.NET MAUI中變得更加容易。為此而採取的措施之一是添加新的語義屬性,以將跨平台屬性映射到本機可訪問性屬性。

<Label 
    Text="Welcome to .NET MAUI!"
    SemanticProperties.HeadingLevel="Level1"
    FontSize="32"
    HorizontalOptions="CenterAndExpand" />

<Label 
    Style="{DynamicResource Glyph}" 
    Text="" 
    SemanticProperties.Description="Heart" />

<Label 
    Text="Click the button. You know you want to!" 
    FontSize="18"
    x:Name="CounterLabel"
    HorizontalOptions="CenterAndExpand" />

<Button 
    Text="Click Me!" 
    Clicked="OnButtonClicked"
    SemanticProperties.Hint="Counts the number of times you click"/>

有關更多信息,請參見this dotnet/maui issue的原始說明和討論。

分享您的反饋

我們對此版本感到很興奮,並期待您的反饋。請加入我們的dotnet/maui,讓我們知道您對這些改進的看法。

對.NET有任何問題,也請歡迎在Microsoft Q&A 論壇提問:
//docs.microsoft.com/en-us/answers/products/dotnet