当前位置 博文首页 > MicrosoftReactor:官宣 MAUI 在.NET Preview 3的最新进展

    MicrosoftReactor:官宣 MAUI 在.NET Preview 3的最新进展

    作者:MicrosoftReactor 时间:2021-05-05 18:14

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

    bk