WinUI 3 试玩报告

WinUI 3 试玩报告

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 什么事了。

WinUI 3 试玩报告

简朴来说,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 3 另有许多利益,例如开源、更新更快、更新不与系统版本绑定等,更详细的内容照样看微软自己怎么宣传吧:

WinUI – The modern native UI platform of Windows.

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

WinUI 3 试玩报告

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 平台:

WinUI 3 试玩报告

WinUI 3 试玩报告

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

WinUI 3 试玩报告

WinUI 3 试玩报告

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

WinUI 3 试玩报告

到这里为止都和预期的一样,我之后还尝试了将 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)。而且 WinUI 2 中代码的命名空间以 Windows.UI 开头,在 WinUI 3 中酿成 Microsoft.UI ,按着 Office 365 更名为 Microsoft 365、Bind Ads 更名为 Microsoft Advertising 这些履历,该不会以后 WinUI 可能更名为 Microsoft UI ,简称 MiUI 吧?

mybatis源码解析-日志适配器

权限

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

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

WinUI 3 试玩报告

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 的代码稍微有一点差别):

for (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 等平台,现在看来照样有它的市场。

WinUI 3 试玩报告

Winform 呢?

人只有忘却了已往,才气好好在世。

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

原创文章,作者:28qn新闻网,如若转载,请注明出处:https://www.28qn.com/archives/14618.html