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

MicrosoftReactor發表於2021-05-05

我們在.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

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

2.png

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

有關安裝和入門的分步說明,也可以參考:
https://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 論壇提問:
https://docs.microsoft.com/en-us/answers/products/dotnet

相關文章