主頁 > .NET開發 > WinUI 3 試玩報告

WinUI 3 試玩報告

2020-09-12 21:12:56 .NET開發

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 程式而已,它就不能好好運行了:

int 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 的代碼稍微有一點不同):

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 等平臺,目前看來還是有它的市場,

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/17125.html

標籤:.NET Core

上一篇:基于 abp vNext 和 .NET Core 開發博客專案 - 博客介面實戰篇(五)

下一篇:dotNET Core 3.X 使用 Autofac 來增強依賴注入

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more