WinUI 3 踩坑记:前言
WinUI 3 (Windows App SDK 于 2021 年 11 月发布了第一个正式版 v1.0.0 [1],最新版本是 v1.1.5 [2]。我的基于 WinUI 3 的个人项目 寻空 从年初开始开发 [3],完整经历了 WinUI 3 的各个版本,见证了从 Bug 满天飞到逐渐完善的全过程。
现在 WinUI 3 趋于稳定,处于可以一用的状态,我也想把开发寻空过程中遇到的有趣的内容分享给大家,系列名就叫 WinUI 3 踩坑记 好了。个人水平有限,文章中难免会出现错误,请各位读者批评指正。
WinUI 3 是什么
WinUI 3 是 Windows App SDK 内的本机 UI 平台组件,那这个 Windows App SDK 又是什么东西,和 Windows SDK 有什么关系,是不是改名部的新操作?
按照微软的文档所说,Windows App SDK 是一组新的开发人员组件和工具,它们代表着 Windows 应用开发平台的下一步发展方向,Windows App SDK 不会代替 Windows SDK 或现有桌面 Windows 应用类型(比如 WinForm、WPF、Win32),而是使用一组通用 API 来补充这些现有工具和应用类型,开发人员可以在这些平台上依赖这些 API 来执行操作 [4]。
微软的文档真不讲人话, 简单来说,WinUI 3 是 Windows 平台最新一代本机应用开发框架,继承了 UWP 的设计语言和 Win32 的运行方式,同时结合了两者的优点,但是也带来了只能跑在 Windows 10 1809 (17763) 及以上版本的限制。
WinUI 3 的优缺点
以下内容总结自我个人的开发体验,仅为一家之言。
优点
- 颜值高。 我选择 WinUI 3 的最重要的原因就是外观,WinUI 3 使用了和 UWP 相同的 UI 框架,完美实现了 Fluent Design 设计语言,控件自带动画效果,也能够使用亚克力和云母材质,适合我这种没有 UI 设计能力的。
- 性能好。 .NET 6 的性能毋庸置疑。
- 权限高。 WinUI 3 本质上是一个 Win32 应用,没有了 UWP 中严格的权限限制,可以放开手脚随便来。
缺点
- 开发体验差。 到现在还没有设计器,只能对着一个 XAML 文件空写,为此我已经练就了一套脑内渲染本领。其次是编译速度慢,真的非常慢。
- 安装包体积大。 发布 WinUI 3 项目必须包含 .NET 运行时,并且暂时还不支持剪裁,一个禁用 ReadyToRun 编译的 WinUI 3 空项目安装包就有 40.6 MB,启用 ReadyToRun 后更是膨胀到 51.5 MB。(Windows App SDK v1.1.4 x64)
- 互操作性能差。 .NET 6 的性能确实毋庸置疑,但是 WinUI 是一个 Native 框架,对控件依赖属性的读写需要通过 CsWinRT 互操作,经过测试要比 WPF 要慢很多 [5]。
- 生态差。 WinUI 3 正式发布不到一年,第三方控件还很少,大部分情况下需要自己写控件。
安装包体积大和互操作性能差仅对于 C# 而言,C++ 开发的 WinUI 3 应用没有这些问题。
总的来说,WinUI 3 是一个未来可期的框架,既有颜值也有体验(当然不是指开发体验)。但是 WinUI 3 本身很难开发高性能的生产力软件,这注定了它不太可能在大型商业软件领域有所作为。而在更广阔的娱乐或工具应用中,WinUI 3 可能会成为一部分新项目的选择,比如 爱奇艺 Preview 。WinUI 3 的未来到底如何,我们拭目以待。
关于本系列
- WinUI 3 踩坑记 不是完整的系列教程,只是和 WinUI 3 相关随笔的合集
- 本系列默认读者了解
- C# 11 和 XAML 的语法
- .NET 6 Runtime API
- WinUI 控件和 WinRT API
- Win32 窗口相关知识
- 若无特殊说明,本系列文章中代码依赖的环境为
Windows 11 22H2 (22621) x64,C# 11 (.NET 6),Windows App SDK v1.1.5 - 系列的所有文章和代码都存档于 GitHub@Scighost/WinUI3Keng,若内容出现冲突以 GitHub 上的为准
开发工具
除了在 Visual Studio 中必装的负载以外,推荐几个提升效率的工具。
Microsoft UI Xaml
WinUI 控件样式源码,这算是必看内容之一。开发中遇到的一些问题,比如 NavigationView 的背景色怎么修改, CheckBox 为什么这么宽, 怎么去掉 ListView 选中时的效果 这些问题都可以通过修改控件样式来解决。
Windows Community Toolkit Sample App
社区工具箱,开发 WinUI 基本离不开这个东西。
WinUI Gallery
这是官方的控件展示,WinUI 的所有自带的控件都能在里面找到用法。有 WinUI 2 和 WinUI 3 两个版本,内容差不多,我觉得 WinUI 2 版的比较好用。

Character Map UWP
字符映射表,一个查看和搜索字体字符的工具。开发过程中经常要查找一些字体图标,在这个应用中都能很方便地找到,还能直接复制生成的代码。

参考
- [1] Windows App SDK v1.0.0
- [2] Windows App SDK v1.1.5
- [3] Xunkong: First commit
- [4] Windows App SDK Document
- [5] Discussion: Dependency property is much slower in WinUI 3 than in WPF
WinUI 3 踩坑记:前言的更多相关文章
- WinUI 3 踩坑记:第一个窗口
本文是 WinUI 3 踩坑记 的一部分,该系列发布于 GitHub@Scighost/WinUI3Keng,文中的代码也在此仓库中,若内容出现冲突以 GitHub 上的为准. WinUI 3 应用的 ...
- WinUI 3 踩坑记:从创建项目到发布
本文是 WinUI 3 踩坑记 的一部分,该系列发布于 GitHub@Scighost/WinUI3Keng,若内容出现冲突以 GitHub 上的为准. 创建项目 现在 WinUI 3 的入门体验比刚 ...
- Spark踩坑记——Spark Streaming+Kafka
[TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...
- Spark踩坑记——数据库(Hbase+Mysql)
[TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...
- 【踩坑记】从HybridApp到ReactNative
前言 随着移动互联网的兴起,Webapp开始大行其道.大概在15年下半年的时候我接触到了HybridApp.因为当时还没毕业嘛,所以并不清楚自己未来的方向,所以就投入了HybridApp的怀抱. Hy ...
- Spark踩坑记——共享变量
[TOC] 前言 Spark踩坑记--初试 Spark踩坑记--数据库(Hbase+Mysql) Spark踩坑记--Spark Streaming+kafka应用及调优 在前面总结的几篇spark踩 ...
- Spark踩坑记——从RDD看集群调度
[TOC] 前言 在Spark的使用中,性能的调优配置过程中,查阅了很多资料,之前自己总结过两篇小博文Spark踩坑记--初试和Spark踩坑记--数据库(Hbase+Mysql),第一篇概况的归纳了 ...
- [转]Spark 踩坑记:数据库(Hbase+Mysql)
https://cloud.tencent.com/developer/article/1004820 Spark 踩坑记:数据库(Hbase+Mysql) 前言 在使用Spark Streaming ...
- Spark踩坑记——数据库(Hbase+Mysql)转
转自:http://www.cnblogs.com/xlturing/p/spark.html 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库 ...
随机推荐
- 在linux上配置Maven环境变量
1.首先下载maven ,这里我使用的是3.8.1 Maven – Download Apache Maven 2.在linux环境中,将maven上传至 /usr/local/目录中 这里我将mav ...
- Java 常用Set集合和常用Map集合
目录 常用Set集合 Set集合的特点 HashSet 创建对象 常用方法 遍历 常用Map集合 Map集合的概述 HashMap 创建对象 常用方法 遍历 HashMap的key去重原理 常用Set ...
- JAVA中简单的for循环竟有这么多坑,你踩过吗
JAVA中简单的for循环竟有这么多坑,你踩过吗 实际的业务项目开发中,大家应该对从给定的list中剔除不满足条件的元素这个操作不陌生吧? 很多同学可以立刻想出很多种实现的方式,但你想到的这些实现方式 ...
- Git的历史和安装Git及环境配置
Git历史同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代. Linux 内核开源项目有着为数众广的参与者.绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务 ...
- .net MVC微信开发自定义View类型菜单时在相应控制器获取用户OpenID的问题
因为公司的项目在接收微信服务器Post过来的数据包是有指定的入口,所以在相应控制器里无法接收到微信服务器Post过来的数据,所以无法获得OpenID,也尝试过先在入口哪里解析获得OpenID再通过Se ...
- 密度峰值聚类算法原理+python实现
密度峰值聚类(Density peaks clustering, DPC)来自Science上Clustering by fast search and find of density peaks ...
- docker多段构建nessus镜像
1.构建基础镜像,主要做安装和获取注册号: FROM ubuntu:16.04 ADD Nessus-8.11.0-debian6_amd64.deb /tmp/Nessus-8.11.0-debia ...
- 关于Request复用的那点破事儿。研究明白了,给你汇报一下。
你好呀, 我是歪歪. 之前不是发布了这篇文章嘛:<千万不要把Request传递到异步线程里面!有坑!> 说的是由于 Request 在 tomcat 里面是复用的,所以如果在一个 Requ ...
- 在Centos下对高并发web框架Tornado的性能进行测试
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_89 在之前的一篇文章中,我们在1g1核的惨淡硬件环境下,对 uwsgi + django 和 gunicorn+ django 的 ...
- 大数据开发,Hadoop Spark太重?你试试esProc SPL
摘要:由于目标和现实的错位,对很多用户来讲,Hadoop成了一个在技术.应用和成本上都很沉重的产品. 本文分享自华为云社区<Hadoop Spark太重,esProc SPL很轻>,作者: ...