WinUI 3学习笔记(1)—— First Desktop App
随着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分钟不等,如需补充基础知识的同学点这里:
开始使用 Visual Studio 开发 Windows 10 应用
WinUI 3学习笔记(1)—— First Desktop App的更多相关文章
- WinUI 3学习笔记(3)—— ComboBox & DropDownButton & SplitButton
本篇想介绍相对小众但颇具使用价值的控件SplitButton,提到SplitButton难免会拿来与ComboBox进行比较,同时在WinUI 3的控件库中,还有一个默默无闻的DropDownButt ...
- Ruby学习笔记4: 动态web app的建立
Ruby学习笔记4: 动态web app的建立 We will first build the Categories page. This page contains topics like Art, ...
- WinUI 3学习笔记(2)—— 用ListView来展示集合
在WPF的时代,我们多是使用ListBox和ListView来展示,纵向滚动条显示的集合数据.这两个控件的默认样式,以及对触控的支持,已完全落后于时代.他们两个分别长这样,和Win10及Win11的风 ...
- 【IMOOC学习笔记】多种多样的App主界面Tab实现方法(四)
ViewPagerIndicator+ViewPager 要想使用ViewPagerIndicator,要使用到viewPagerlibrary开源库 top.xml <?xml version ...
- 学习笔记:只有一套app设计稿(5s尺寸)切出4和4s尺寸以及安卓系统主流尺寸的图
如何在只有一套app设计稿(5s尺寸)切出4和4s尺寸以及安卓系统主流尺寸的图 转自:http://www.zhihu.com/question/23255417 版权归原作者所有 目前ios手机 ...
- node.js在windows下的学习笔记(7)---express的app.js的详细配置说明
var express = require('express'); var path = require('path'); var favicon = require('serve-favicon') ...
- Android(java)学习笔记123:Clock app编写报错01
1.首先我们二话不说直接先看报错内容如下: 07-12 08:25:03.572: E/dalvikvm(3602): native fork pid:0 done. 07-12 08:25:03.5 ...
- Android(java)学习笔记125:Clock app编写报错02
1.首先之间看错误: 07-13 10:07:55.354: E/AndroidRuntime(8008): FATAL EXCEPTION: main 07-13 10:07:55.354: E/A ...
- Ruby学习笔记6: 动态web app的建立(3)--多Model之间的交互
We first built a static site which displayed a static image using only a Controller and a View. This ...
- Ruby学习笔记5: 动态web app的建立 (2)
上一节里,我们搭建了一个数据库的结构,并用index验证了request-response cycle,如下图: 1. Add show method into Controller 这一节,我们要继 ...
随机推荐
- 01-前端开发Vscode插件配置
01 自动保存配置 02 空格渲染方式 配置好以后,可以看到代码的空格有几个,以点的方式呈现,1个点表示1个空格 03 图标插件 VSCode Great Icons 04 缩进 推荐使用2 05 v ...
- Python_10 debug、类和对象
一.查缺补漏 APP测试流程梳理https://www.cnblogs.com/dengqing9393/p/6497068.html 有关类的知识点http://testingpai.com/art ...
- 算法金 | Transformer,一个神奇的算法模型!!
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 在现代自然语言处理(NLP)领域,Transformer 模型的出现带 ...
- TI AM64x工业开发板硬件说明书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)
前 言 本文主要介绍TL64x-EVM评估板硬件接口资源以及设计注意事项等内容. 创龙科技TL64x-EVM是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核C ...
- joigsc2022_e 题解
翻译 有长度为 \(n\) 的序列 \(a\) 和 \(L\),你需要对于每个 \(x \in[1,n]\) 求出若把第 \(x\) 个数到第 \(n\) 个数依次装入容量为 \(L\) 的箱子中(每 ...
- 【java深入学习第1章】深入探究 MyBatis-Spring 中 SqlSession 的原理与应用
前言 在使用 MyBatis 进行持久层开发时,通常会与 Spring 框架集成,以便更好地管理事务和依赖注入.在 MyBatis-Spring 集成中,SqlSession 是一个非常重要的概念.本 ...
- 基于 Impala 的高性能数仓实践之物化视图服务
本文将主要介绍 NDH Impala 的物化视图实现. 接上篇,前两篇分别讲了执行引擎和虚拟数仓,它们是让一个 SQL 又快又好地执行的关键.但如果某些 SQL 过于复杂,比如多张大表进行 Join ...
- oeasy教您玩转vim - 79 - # 编码格式encoding
- `help encoding-name` ![图片描述](https://s4.51cto.com/images/blog/202201/03083053_61d243bd719358 ...
- 【游记】CSP 2023
day 0 和 printfmingren 整理了一下不会的知识点,发现有点多,遂开摆 音游真的太好玩了 对着<算法竞赛进阶指南>复习了下对拍器的写法,把部分算法的模板又打了一遍 感觉前途 ...
- vue table表格实现无缝滚动 鼠标进入可悬停
<el-table ref="table" :data="tableData" :header-cell-style="{background: ...