官宣 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中开始探索。
一旦有了用于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
现在运行> 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
官宣 MAUI 在.NET Preview 3的最新进展的更多相关文章
- 【官网】2019.5.19 CentOS8.0 最新进展
Contents CentOS 8 Rough Status Page General Steps Architectures Main architectures AltArch Current T ...
- 官宣 .NET MAUI 预览版 6
最近,我们发布了.NET 多平台应用程序UI (MAUI)的最新进展. 在此版本中,我们全力支持Visual Studio 2022 预览版2.这也标志着我们首次将.NET MAUI 作为工作负载安装 ...
- 官宣 ! 52abp_Pro版本低调上线
上线了 官宣!官宣!官宣! 重要的事情说三次. 是的,你没有看错 https://www.52abp.com/ 的官方企业模板:52abp-pro已经正式上线. 至此52abp.com的官方网站就算告 ...
- TPCx-BB官宣最新世界纪录,阿里巴巴计算力持续突破
2019年9月17日,TPC官宣Alibaba Cloud MaxCompute认证结果.同月26日,杭州云栖大会阿里巴巴宣布了这一成绩,飞天大数据平台计算引擎MaxCompute成为全球首个TPCx ...
- 官宣 | Apache Flink 1.12.0 正式发布,流批一体真正统一运行!
官宣 | Apache Flink 1.12.0 正式发布,流批一体真正统一运行! 原创 Apache 博客 [Flink 中文社区](javascript:void(0) 翻译 | 付典 Revie ...
- [刘阳Java]_Web前端入门级练习_迅雷官宣网设计
也有一段时间没有写一些技术专题文章,今天给大家来几篇Web前端入门级练习的文章.主讲<迅雷官宣网>的设计,相信大家平时也用过迅雷这个下载工具,所以分享的这篇技术大家在一定程序会感兴趣. 先 ...
- Spring官宣网传大漏洞,并提供解决方案
Spring沦陷了!这样的标题这几天是不是看腻了?然而,仔细看看都是拿着之前的几个毫不相干的CVE来大吹特吹.所以,昨天发了一篇关于最近网传的Spring大漏洞的文章,聊了聊这些让人迷惑的营销文.以及 ...
- 官宣 .NET 7 Preview 2
今天,我们很高兴发布 .NET 7 预览版 2..NET 7 的第二个预览版包括对 RegEx 源生成器的增强.将 NativeAOT 从实验状态转移到运行时的进展,以及对"dotnet n ...
- [翻译] .NET 官宣跨平台 UI 框架 MAUI
MAUI Build 2020 大会上,微软终于正式公布 .NET 上的跨平台框架,正式版将在 .NET 6 和大家见面. MAUI 是日益流行的 Xamarin.Forms 的进化,Xamarin. ...
随机推荐
- SpringBoot(五):SpringBoot使用拦截器
1.按照SpringMVC的方式编写一个拦截器: 2.配置一个类 implements WebMvcConfigurer 接口 为该类添加注解@Configuration (等价于一个sprin ...
- 【HTB系列】靶机Querier的渗透测试
出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) 总结与反思: 1.收集信息要全面 2.用snmp-check检查snmp目标是否开启服务 ...
- Linux自学之旅-基础命令(chown和chgrp)
转: Linux自学之旅-基础命令(chown和chgrp) Linux自学之旅-基础命令(改变所有者与所属组的命令) 文章目录 前言 一.chown命令 二.chgrp命令 总结 前言 1.上一节我 ...
- 微信小程序日期时间选择器(精确到秒)
<picker mode="multiSelector" value="{{dateTime1}}" bindchange="changeDat ...
- HDOJ-1358(字符串压缩+KMP)
Period HDOJ-1358 这题还是属于KMP算法的应用,属于字符串压缩问题.也就是在一个字符串s中寻找一个前缀,使得s可以被一份或者多份前缀子串t拷贝连接,也就是串接. #include< ...
- VirtualBOX 虚拟机 FreeBSD配置
pkg装virtualbox-ose-additions, 再将 Section "Device"Identifier "Card0"Driver " ...
- Java标识符,关键字,保留字三者区分(主要是从官网摘抄)
区分 标识符(Identifiers) An identifier is an unlimited-length sequence of Java letters and Java digits, t ...
- BZOJ_4034 [HAOI2015]树上操作 【树链剖分dfs序+线段树】
一 题目 [HAOI2015]树上操作 二 分析 树链剖分的题,这里主要用到了$dfs$序,这题比较简单的就是不用求$lca$. 1.和树链剖分一样,先用邻接链表建双向图. 2.跑两遍$dfs$,其实 ...
- 官方正式发布 Java 16
前言 就在2021/03/16,官方正式发布了Java 16.我们可以下载使用Java 16了. 特性 向量API(孵化) 在运行期,Vector 表示向量计算可以可靠地编译成支持CPU架构上的最佳矢 ...
- LiteOS内核源码分析:任务LOS_Schedule
摘要:调度,Schedule也称为Dispatch,是操作系统的一个重要模块,它负责选择系统要处理的下一个任务.调度模块需要协调处于就绪状态的任务对资源的竞争,按优先级策略从就绪队列中获取高优先级的任 ...