随着Visual Studio 2019 16.10版本的正式发布,创建WinUI 3的APP对我们来说,已不存在任何的难度。本篇我们就试着来一探究竟,看看WinUI 3 APP到底是个啥玩意,能不能重振Windows桌面开发。
首先让我们把Visual Studio更新到16.10版本,16.10版本不仅全面支持热重载、实时可视化树和实时属性资源管理器。同时也不再需要修改Project文件,以修正 .NET SDK 和 winrt.runtime.dll 的版本不匹配的问题。
在Visual Studio 2019,让我们找到Blank App, Packaged (WinUI 3 in Desktop)项目模板。如果发现没有该模板,则需要去以下地址下载安装。
Project Reunion - Visual Studio Marketplace
或者通过Visual Studio的Manage Extensions进行安装。
这里选择Packaged的Desktop项目,某软声明该类型的工程已可以用于生产环境。而For UWP的版本仍是preview阶段,至于非Packaged的Desktop项目,还要等到年底才能得到支持。需要注意的是,WinUI3 当前最低支持的Win10版本是1809,然后目标版本是2004。如果小伙伴们发现没有2004即Build19041的SDK可以选,证明你的Windows10需要升级了。
点击OK后,我们将成功创建第一个WinUI3的APP。打开解决方案管理器的话,默认的代码的结构如下图。整个解决方案下共有2个工程,作为主体的FirstWinUI3App,以及打包进商店用的FirstWinUI3App(Package)工程。看上去和之前DesktopBridge的打包方式极为相似,但是如果我们去检查Packages的话,会发现WinUI3引用的libraries都已经归属于ProjectReunion项目了。
检查FirstWinUI3App工程,app.manifest作为Windows APP的传统配置文件,支持的OS版本,要不要管理员权限启动,都在这里定义,我们先不去管他。
App.xaml和MainWindow的组合,就是标准的WPF和UWP的开局。其中App.xaml会提供一个ResourceDictionary,来放置Application级别的资源。
<Application x:Class="FirstWinUI3App.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:FirstWinUI3App"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls" /> <!-- Other merged dictionaries here --> </ResourceDictionary.MergedDictionaries> <!-- Other app resources here --> </ResourceDictionary> </Application.Resources> </Application>
而在App.xaml.cs中,因为该Desktop工程没有UWP中的Suspend和Resume等概念,就只overrid了OnLaunched方法,提供了一个类级别的Window对象。从这点来看Dekstop版本的WinUI 3工程,更像WPF。
MainWindow是一个标准的XAML Window对象,在App.xaml.cs的OnLaunched方法中实例化,然后Activate。
protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args) { m_window = new MainWindow(); m_window.Activate(); } private Window m_window;
当然我们也可以抛开Window对象,像UWP一样通过Page开局。
protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args) { m_window = new Window(); var rootFrame = new Frame(); m_window.Content = rootFrame; rootFrame.Navigate(typeof(BlankPage1)); m_window.Activate() } private Window m_window;
如果我们打开MainWindow.xaml文件,会发现命名空间依然和十年前如出一辙,可以认为XAML这套东西仍会在将来的很长一段时间内存在。我们切换到MainWindow.xaml.cs中,情况和WPF或UWP就稍有不同。命名空间由WPF的Syste.Windows和UWP的Windows.UI.Xaml被统一为了Microsoft.UI.Xaml。这应该就是WinUI 3的使命,即统一今后Windows 桌面开发的UI。同时我也注意到,除了System这样的基础框架类库外(可以认为这部分与平台无关,隶属于.NET 5),Win UI3对Windows runtime API的使用,已经切换到了Windows.Foundation这一命名空间下,与UWP保持一致。
如果忽略这些细节上的变动,那么可以认为WinUI 3的Desktop版,就是WPF+UWP混着写。至于流毒甚久的某软出一版框架,就要推倒重头学一次的说法,我个人表示完全是无稽之谈,至少从WPF,Sliverlight,UWP到WinUI 3都是平滑过渡。
下面转到FristWinUI3App(Package)工程,这个打包工程是用于将exe打包成MSIX结构的安装文件,上传到微软商店用的。以后如果支持非Package版的Desktop开发,该工程则不是必须的。
Dependencies下的Applications节点,包含被打包的FirstWinUI3App的引用,当然这个是自动添加的,不需要我们操心。Images节点下,包含了微软商店应用程序需要的各种尺寸的图标和图片。
最后我们双击Package.appxmanifest文件,可以打开该文件对应的编辑器,用以声明APP的各种能力,设置图标,标注APP需要向用户申请的权限,以及打包的信息诸如发行商,APP名称等等。这一块的内容完全继承自UWP。
对WinUI 3的第一次探索到此就告一段落。后面我们会在Github上fork Xaml-Controls-Gallery这个repo,并切换到WinUI3分支,来进一步学习WinUI 3是怎么将现代化的UI带给Windows Desktop APP的。
本篇示例代码:
WinUI3Samples/WinUI3Samples/FirstWinUI3App at main · manupstairs/WinUI3Samples (github.com)
以下链接,是MS Learn上Windows开发的入门课程,单个课程三十分钟到60分钟不等,如需补充基础知识的同学点这里: