官宣 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. ...
随机推荐
- 使用Maven新建SpringBoot工程
最近用IDEA插件创建Springboot项目,总是403,估计被墙了! 那么这里在提供两种方法 1.从官网下载模板,导入IDEA内 2.使用Maven创建 方法一:打开 https://start. ...
- C++对象的生存期笔记
下面随笔记录了C++对象的生存期知识 静态生存期 这种生存期与程序的运行期相同. 在文件作用域中声明的对象具有这种生存期. 在函数内部声明静态生存期对象,要冠以关键字static . 动态生存期 块作 ...
- 医学图像 | DualGAN与儿科超声心动图分割 | MICCAI
文章转自微信公众号:「机器学习炼丹术」 作者:炼丹兄(已授权) 联系方式:微信cyx645016617(欢迎交流共同进步) 论文名称:"Dual Network Generative Adv ...
- Codeforces 1167c(ccpc wannafly camp day1) News Distribution 并查集模板
题目: In some social network, there are nn users communicating with each other in mm groups of friends ...
- ASP.NET如何把ASPX网站部署到IIS上
当一个项目完成了,你是否想过把它发布到服务器上去呢?那么下面就来告诉你如何去部署它吧! (Visual Studio版本: 2019) 首先要准备好你的项目 然后进行如下操作 第一大步骤 1.打开你需 ...
- mysql内一些可以报错注入的查询语句
一.exp() 取反参数 该函数简单来说就是,以e为底的对数,在当传递一个大于709的值时,函数exp()就会引起一个溢出错误,取反则可以导致很小的数值变得很大,比如说0 这样既可配合使用,e ...
- 过多if - else 的问题, 以及策略模式 + 反射解决方法
策略模式解决if - else 的代码 业务场景: 外包企业的审批人需要审批打卡的场景: 审批人分为多种不同的级别,多种级别中具有方式相同但是内容不同的操作:审批. 原来场景: 有前端传来审批人参数, ...
- Java 运行时数据区和内存模型
运行时数据区是指对 JVM 运行过程中涉及到的内存根据功能.目的进行的划分,而内存模型可以理解为对内存进行存取操作的过程定义.总是有人望文生义的将前者描述为 "Java 内存模型" ...
- 修改RedHat7的root用户密码
前言 前段时间由于长时间没有使用虚拟机里面的一个操作系统,导致密码记得不是太清,登录不进去.今天想起还是做个小记录,以便以后参考. 再一个是,当时网上也搜了很多解决问题的博客,但大部分都是同一个博客内 ...
- Codeforces 784B Santa Claus and Keyboard Check
题面: 传送门 B. Santa Claus and Keyboard Check Input file: standard input Output file: standard output Time ...