1. 什么是 WinUI 3#

在微软 Build 2020 开发者大会上,WinUI 团队宣布可公开预览的 WinUI 3 Preview 1,它让开发人员可以在 Win32 中使用 WinUI。WinUI 3 Preview 1 包含新的 VisualStudio 项目模板,可以创建面向 .NET 5 的 C# 和 C++/Win32 项目。从技术上讲,WinUI 3 将 UWP 的 XAML、Composition 和 Input 层分离,并通过NuGet将它们独立分发给针对Windows 10 版本 1803 及更高版本的 Win32 应用。

WinUI 3 适用于 Win32 和 UWP,这篇文章主要讨论 Win32 的情况。

2. 理解 WinUI 3#

以前我们总是抱怨 WPF 多年都不提供新的主题,不提供新的控件,性能又没提升。现在微软索性把什么都是新的 WinUI 3 提供给桌面开发,没 WPF 什么事了。

简单来说,UWP 的开发体验不好(关于这个话题真是一言难尽),而且出了 Bug 还必须等待下半年的 Windows 更新进行修复,但微软的开发人员专心给 UWP 的 UI 层加各种功能;.NET Core 更新很快,但很少人有兴趣有动力给陈旧的 WPF 的 UI 层进行大幅度的改进。于是 WinUI 将 UWP 的 UI 层从 Windows SDK 的其它部分分离,并将从 Windows 转移到 Nuget。现在建一个 C++ 或 C#(.NET 5) 程序,再从 Nuget 上装个 WinUI 3 的包套个 UI 层,一个基于 Fluent Design,触摸友好,性能无与伦比的应用程序就诞生了。

上图列举了 WinUI 3 和其他平台对比的部分特性,除此之外 WinUI 3 还有很多好处,例如开源、更新更快、更新不与系统版本绑定等,更详细的内容还是看微软自己怎么宣传吧:

WinUI - The modern native UI platform of Windows.

不过要用上 WinUI 3 还要等一年半载。下面是微软给出的发布路线图,目前我们也只能用 Preview 版尝尝鲜。

3. 试玩WinUI 3#

要试玩 WinUI 3 首先要有 Windows 10 1803 以上版本的电脑(WinUI 3 最低支持1803),然后还需要使用 Visual Studio 2019 16.7 以上版本(目前只能安装预览版)。安装 Visual Studio 时要把以下工作负载全都选上:

  • .NET 桌面开发

  • 通用 Windows 平台开发

  • 使用 C++ 的桌面开发

  • 适用于通用 Windows 平台负载的 C++(V142) 通用 Windows 平台工具可选组件

当然 .NET 5.0 也要装上。

然后在 https://aka.ms/winui3/previewdownload 下载并安装 WinUI 3 Project Templates 扩展,这样才可以在  Visual Studio 创建 WinUI 的项目。

可选  C++ 或 C# ,这里我选择了 C# 的“Blank App, Packaged
(WinUI in Desktop)”项目,并选择了对应的 Windows 平台:

项目创建后 Visual Studio 生成了两个项目。第一个包含应用的代码,代码结构基本和 UWP 一样,只是少了用于打包应用的 Package.appxmanifest 和一些图片。从依赖项里可以看到项目已经安装了 Microsoft.WinUI 3 的包。从项目属性里可以看到这就是个 .NET 5 的项目。

Visual Studio 生成的第二个项目是一个 Windows 应用程序打包项目,该项目经配置后可将应用生成为适合部署的 MSIX 程序包。 也就是说 UWP 项目中用于打包的部分被独立出来了。这个项目还应该是解决方案的启动项目。运行这个项目后创建的应用会添加到开始菜单中,这点也和UWP一样。

到这里为止都和预期的一样,我之后还尝试了将 UWP 应用移植到 WinUI ,基本上只需要将 Windows.UI 命名空间改为 Microsoft.UI就可以了,XAML 和 C# 代码完全不用变。只可惜目前 WinUI 还很简陋,Win2D、Community Toolkit 等微软自己发布的 UWP 包都还没有 WinUI 版本。而且没有设计视图,XAML 视图也没有智能感知,现在想要用 WinUI做些什么有趣的项目会很困难。不过从目前的移植难度上来看,将来正式发布后应该可以完整地将 UWP 的 UI 的开发经验运用在 WinUI 上。

4. 和 WPF 及 UWP 进行对比#

既然 WinUI 3 开发模式和 WPF 及 UWP 都很像,我当然对它们之间的对比很感兴趣。

命名#

首先说说命名,“WinUI” 光这个名字就 Win 了。 “UWP” 太高雅,我敢打赌国内有些 UWP 的开发(例如我)都不能好好地把 UWP 的全称拼出来;“WPF” 好些,但 WPF 的含义也让人很疑惑。而 Windows UI 简称 WinUI ,意义和发音都很清晰明确。不过这三个都比很多人都不会读的 “Xamarin” 强多了。

可是有了 WinUI 3 ,就会有人问“那 WinUI 2 呢?”WinUI 2是一个 UWP 的控件库,当然的只能用在 UWP 上。这就很尴尬了,WinUI 的 3 和 2 根本不是同一个概念,实在很容易让人混淆,说不定以后会把后缀的 3 去掉(我这篇文章就常常懒得理写这个3)。而且 UWP 中代码的命名空间以 Windows.UI 开头,在 WinUI 3 中则 Microsoft.UI ,按着 Office 365 改名为 Microsoft 365、Bind Ads 改名为 Microsoft Advertising 这些经验,该不会以后 WinUI 可能改名为 Microsoft UI ,简称 MiUI 吧?

权限#

权限方面是 WinUI 的一个亮点,因为它本质上就是个 Win32 程序,可以放开手脚随便来。相对的 UWP 有很严格的权限限制,开发 UWP 时常常会感到绑手绑脚。例如下面这段代码,大部分 WPF 开发者都难以想象只是最小化 UWP 程序而已,它就不能好好运行了:

Copyint count = 0;
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += (s, e) =>{myButton.Content = count++;};
timer.Start();

UWP 的生命周期如上图,当 UWP 处于 background 运行或 suspended 状态时应用基本处于暂停状态,也也不会处理UI功能。我明白这是 UWP 为了省电、安全等原因才这样设计,但对开发人员来说真的太不方便。而 WinUI 应用基本上就是个 Win32 应用,目前看来不会有这些坑。

开发体验#

说起开发体验,WPF 好歹还算正常,Visual Studio 的设计视图运行正常,编译起来也快。UWP 编译很慢,设计视图经常出问题,Blend 也时好时坏把设计师都气跑了。就算完全按着官方的文档完成一个 UWP App,甚至一行代码都不改,发布到商店后还是有可能崩溃。而对于应用商店,真是千言万语汇聚成一个草花头。

现在 WinUI 的 XAML 视图连智能感知都没有,也没有设计视图,实在没法谈开发体验。很难猜测正式发布的时候会怎么样,希望至少和WPF保持一致吧。

性能#

WPF 总是给人“慢”的印象,除了因为在它刚出来的时候(10年前)电脑性能不够导致留下了刻板印象,还有一个主要原因是:它真的很慢。

UWP 的 XAML 有很优秀的性能表现,除此之外为了照顾已经不存在的 Windows Phone 的贫弱性能,很多控件模版都经过精心设计并大幅简化。

为了验证 WinUI 的性能我写了下面这些代码,然后分别移植到 WPF .Net Framework 4.8、WPF .NET 5、UWP、WinUI(WPF 和 UWP/WinUI 的代码稍微有一点不同):

Copyfor (int i = 0; i < 50; i++)
{var rectangle = new Rectangle{Height = 500,Width = 500,Opacity = ((double)i + 40) / 100d,RadiusX = 108,RadiusY = 98,StrokeThickness = 3,Stroke = new SolidColorBrush(Color.FromArgb(255, 75, 75, (byte)(i * 250d / 50d))),RenderTransformOrigin = new Point(0.5, 0.5)};Root.Children.Add(rectangle);var angle = i * 360d / 50d;var transform = new RotateTransform{Angle = angle};rectangle.RenderTransform = transform;var storyboard = new Storyboard();storyboard.Children.Add(new DoubleAnimation { Duration = TimeSpan.FromSeconds(1), From = angle, To = angle + 360 });Storyboard.SetTarget(storyboard, transform);Storyboard.SetTargetProperty(storyboard, "Angle");storyboard.RepeatBehavior = RepeatBehavior.Forever;storyboard.Begin();
}

上面这段代码是让50个矩形旋转,十分考验 WPF 的性能。结果可以说出乎意料。

CPU 内存 GPU
WPF .NET Framework 4.8 12 60 76
WPF .NET 5.0 12 85 72
UWP 3 28 36
WinUI 5 65 95

我的环境是 i7-6820HQ 及集成显卡。WPF 平台占用 70 多%的 GPU,这我大致能猜到。UWP 十分流畅,GPU 只占用 WPF 的一半,CPU 和 内存都有出色表现,不过我还以为会更低的。

WinUI 这个浓眉大眼的我真的万万没想到,不仅掉帧明显,还占用了几乎 100% GPU,也就是说它连这么简单的代码都跑不起来。()顺便一提,将测试代码中旋转的矩形减少为10个,WPF 的程序占用 32% GPU,而 WinUI 占用 70 多%。)

从上面的数据基本可以说明,WinUI 离设计目标还十分遥远,毕竟是预览版,还有一年半载可以慢慢优化。

5. 结语#

总的来说微软雄心勃勃,可是现在拿出来的 WinUI 预览版还差得太远,功能未完善,性能不及预期。我觉得大致方向没错,WinUI 对 C++、WPF、UWP 开发者都是个新的工具新的机遇,可以关注一下。

6. Q & A#

Windows 7 怎么办?#

按微软公布的路线图,再包括跳票等因素,等 WinUI 真正可用时 Windows 7 已停止更新很久,到时 Windows 7 的占有率可能已经下降到开发者不会关心的程度。

基于 .NET Core 的 Wpf 还是 WinUI?#

假使不想花精力将现有项目迁移到 WinUI,或者对来自 UWP 的 WinUI 没信心,又或者舍不得 Windows 7 的用户,并且对触摸没需求,当然可以继续选用 WPF,基于 .NET Core 的 WPF 会是个很好的选择。

MAUI 还是 WinUI ?#

MAUI 还在很遥远的将来(2021年11月),我没试玩过,所以不好评价。如果有跨平台需求当然只能选 MAUI,如果 WinUI 团队技高一筹实现了 MAUI 难以企及的超高性能,那就选 WinUI。不过 MAUI 这个名字太过普通/普遍,可能会被逼着改名吧。

那 UWP 呢?#

权限受限的 UWP 可以说是人畜无害,对用户来说可能也是个不错的选择。而且 UWP 还支持 Xbox 和 Hololens 等平台,目前看来还是有它的市场。

Winforms 呢?

人只有忘却了过去,才能好好活着。

WinUI 有未来吗?

我做了好多年 Silverlight 开发,买了5、6部 Windows Phone 手机,写了几十篇 UWP 文章,根据我丰富的经验,我可以肯定 WinUI 是有未来的。

8. 参考

WinUI - The modern native UI platform of Windows.

Introducing WinUI 3 Preview 1 - Windows Developer Blog

Get started with WinUI 3 for desktop apps Microsoft Docs

GitHub - microsoft_microsoft-ui-xaml

Windows UI Library Roadmap

WinUI 3.0_ The future of Windows controls

WinUI 3 试玩报告相关推荐

  1. A-Frame WebVR试玩报告

    什么叫真?你怎样给真下定义,如果你说真就是你能感觉到的东西,你能闻到的气味,你能尝到的味道,那么这个真只是你大脑作出反应的电子信号. -- <黑客帝国> 关于VR技术 VR即Virtual ...

  2. 创新虎仔音箱试玩报告

    本文来自: www.mycreative.com.cn 伴随着2010年的脚步,我们送走了牛年迎来了虎年.创新发布了这样一款虎仔音箱非常应情应景."两只老虎,两只老虎,叫的响,唱的欢,嘴巴翘 ...

  3. ps4数据库和html,PS4《原神》试玩:争议之外,究竟学到了哪些东西?

    由于众所周知的原因,在2019年Chinajoy索尼展台上出展的<原神>在亮相之前就积累了极大的关注度--尽管这其中争议的声音占了所有评论中的绝大多数,大部分玩家都将矛头指向了游戏画风和建 ...

  4. 应用、游戏和品牌的新营销方式-试玩广告

    一.什么是"试玩广告"? 试玩广告是部署为广告格式的迷你游戏和教程.它们提供应用程序提供的预览.游戏和非游戏应用程序都采用可玩广告来提高用户获取 (UA). 与传统广告格式不同,试 ...

  5. 网页大作业——街机游戏拳皇(KOF)系列的介绍及试玩。

    网页制作报告 网站的主题说明 本网站主题是街机游戏拳皇(KOF)系列的介绍及试玩. 网站的总体规划与网站的结构框图 网站共分为:主页.人物介绍.公司介绍.系列介绍.游戏试玩五个部分.框图如下 网站设计 ...

  6. 在线试玩,在体感游戏中打败泰森,这位小哥破解了任天堂「拳无虚发」

    视学算法报道 编辑:张倩.陈萍 加入体感控制,这位小哥破解了原版任天堂的拳击格斗游戏「拳无虚发」. 在经典红白机上玩拳击游戏是很多人的童年回忆,其中就包括任天堂 1987 年发布的拳击格斗游戏--「P ...

  7. 华人团队用Transformer做风格迁移,速度快、可试玩,网友却不买账

    视学算法报道 编辑:杜伟 利用神经网络进行风格迁移是一项非常常见的任务,方法也很多,比如基于优化和基于 RL 的方法.最近,来自百度 VIS 团队的研究者提出了一种基于 Transformer 的风格 ...

  8. 清华唐杰团队造了个“中文AI设计师”,效果比Dall·E好,可在线试玩

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 要说20 ...

  9. 码农也来玩奥运开幕式“超级变变变”!相机动捕,实时转换赛事图标,项目开源可试玩...

    来源:大数据文摘本文约2600字,建议阅读5分钟 来为奥运"花样"加油. 大家都有在看奥运会吗? 7月23日,东京时间晚上8点,延期一年的东京奥运会终于开幕,本应座无虚席可容纳6. ...

最新文章

  1. 网站基于vs,复选框,单选款
  2. 利用memcached做缓存服务器,为后端tomcat服务器做会话保持,利用httpd的jk模块模块做负载均衡...
  3. Verilog 中的 ^ 的用法
  4. layui table 列覆盖
  5. 将Sql数据库中的表导出到指定文件
  6. Maven编译代码的相关命令
  7. SAP Spartacus的单元测试目录结构
  8. table表格for循环绑定数据_.NET MVC 页面表格绘制
  9. 使用 Hasor 从数据库查询显示到页面上
  10. 软件测试python测试步骤_软件测试员必备基础:3分钟带你入门自动化测试!
  11. java实现lru缓存_Java中的LRU缓存实现
  12. 页面加载速度缓慢时,如何优化?
  13. web 前端(轮番插件)
  14. [windows]JDK安装与环境变量配置
  15. 一文掌握智能抠图Deep Image Matting(pytorch实现)
  16. Object-Oriented Programming Summary Ⅲ
  17. 怎么把图片转PDF格式?转换方法分享
  18. su oracle是什么意思,su 命令 以及 su oracle 与su - oracle 命令区别
  19. python实现简单购物商城_python实现简单购物商城
  20. 费舍尔精确检验在关联分析中的应用

热门文章

  1. Git 常用命令(二)
  2. cocos2d-x 3.0rc2中读取sqlite文件
  3. UIView 的基础
  4. 【IBatisNet Spring.Net】ORM与IOC 简单配置
  5. Teams Bot开发系列:Middleware
  6. iphone解锁_有人可以用解锁的iPhone做的最糟糕的事情是什么?
  7. chromebook刷机_如何获取Android应用以查看Chromebook上的外部存储
  8. 软件架构实践文章链接
  9. Monkey测试实例
  10. 4. MyBatis几个可以优化的地方