WinUI 3 試玩報(bào)告

      網(wǎng)友投稿 1126 2025-03-31

      1. 什么是 WinUI 3#


      在微軟 Build 2020 開(kāi)發(fā)者大會(huì)上,WinUI 團(tuán)隊(duì)宣布可公開(kāi)預(yù)覽的 WinUI 3 Preview 1,它讓開(kāi)發(fā)人員可以在 Win32 中使用 WinUI。WinUI 3 Preview 1 包含新的 VisualStudio 項(xiàng)目模板,可以創(chuàng)建面向 .NET 5 的 C# 和 C++/Win32 項(xiàng)目。從技術(shù)上講,WinUI 3 將 UWP 的 XAML、Composition 和 Input 層分離,并通過(guò)NuGet將它們獨(dú)立分發(fā)給針對(duì)Windows 10 版本 1803 及更高版本的 Win32 應(yīng)用。

      WinUI 3 適用于 Win32 和 UWP,這篇文章主要討論 Win32 的情況。

      2. 理解 WinUI 3#

      以前我們總是抱怨 WPF 多年都不提供新的主題,不提供新的控件,性能又沒(méi)提升。現(xiàn)在微軟索性把什么都是新的 WinUI 3 提供給桌面開(kāi)發(fā),沒(méi) WPF 什么事了。

      簡(jiǎn)單來(lái)說(shuō),UWP 的開(kāi)發(fā)體驗(yàn)不好(關(guān)于這個(gè)話題真是一言難盡),而且出了 Bug 還必須等待下半年的 Windows 更新進(jìn)行修復(fù),但微軟的開(kāi)發(fā)人員專(zhuān)心給 UWP 的 UI 層加各種功能;.NET Core 更新很快,但很少人有興趣有動(dòng)力給陳舊的 WPF 的 UI 層進(jìn)行大幅度的改進(jìn)。于是 WinUI 將 UWP 的 UI 層從 Windows SDK 的其它部分分離,并將從 Windows 轉(zhuǎn)移到 Nuget。現(xiàn)在建一個(gè) C++ 或 C#(.NET 5) 程序,再?gòu)?Nuget 上裝個(gè) WinUI 3 的包套個(gè) UI 層,一個(gè)基于 Fluent Design,觸摸友好,性能無(wú)與倫比的應(yīng)用程序就誕生了。

      WinUI 3 試玩報(bào)告

      上圖列舉了 WinUI 3 和其他平臺(tái)對(duì)比的部分特性,除此之外 WinUI 3 還有很多好處,例如開(kāi)源、更新更快、更新不與系統(tǒng)版本綁定等,更詳細(xì)的內(nèi)容還是看微軟自己怎么宣傳吧:

      WinUI - The modern native UI platform of Windows.

      不過(guò)要用上 WinUI 3 還要等一年半載。下面是微軟給出的發(fā)布路線圖,目前我們也只能用 Preview 版嘗嘗鮮。

      3. 試玩WinUI 3#

      要試玩 WinUI 3 首先要有 Windows 10 1803 以上版本的電腦(WinUI 3 最低支持1803),然后還需要使用 Visual Studio 2019 16.7 以上版本(目前只能安裝預(yù)覽版)。安裝 Visual Studio 時(shí)要把以下工作負(fù)載全都選上:

      .NET 桌面開(kāi)發(fā)

      通用 Windows 平臺(tái)開(kāi)發(fā)

      使用 C++ 的桌面開(kāi)發(fā)

      適用于通用 Windows 平臺(tái)負(fù)載的 C++(V142) 通用 Windows 平臺(tái)工具可選組件

      當(dāng)然 .NET 5.0 也要裝上。

      然后在 https://aka.ms/winui3/previewdownload 下載并安裝 WinUI 3 Project Templates 擴(kuò)展,這樣才可以在 Visual Studio 創(chuàng)建 WinUI 的項(xiàng)目。

      可選 C++ 或 C# ,這里我選擇了 C# 的“Blank App, Packaged

      (WinUI in Desktop)”項(xiàng)目,并選擇了對(duì)應(yīng)的 Windows 平臺(tái):

      項(xiàng)目創(chuàng)建后 Visual Studio 生成了兩個(gè)項(xiàng)目。第一個(gè)包含應(yīng)用的代碼,代碼結(jié)構(gòu)基本和 UWP 一樣,只是少了用于打包應(yīng)用的 Package.appxmanifest 和一些圖片。從依賴項(xiàng)里可以看到項(xiàng)目已經(jīng)安裝了 Microsoft.WinUI 3 的包。從項(xiàng)目屬性里可以看到這就是個(gè) .NET 5 的項(xiàng)目。

      Visual Studio 生成的第二個(gè)項(xiàng)目是一個(gè) Windows 應(yīng)用程序打包項(xiàng)目,該項(xiàng)目經(jīng)配置后可將應(yīng)用生成為適合部署的 MSIX 程序包。 也就是說(shuō) UWP 項(xiàng)目中用于打包的部分被獨(dú)立出來(lái)了。這個(gè)項(xiàng)目還應(yīng)該是解決方案的啟動(dòng)項(xiàng)目。運(yùn)行這個(gè)項(xiàng)目后創(chuàng)建的應(yīng)用會(huì)添加到開(kāi)始菜單中,這點(diǎn)也和UWP一樣。

      到這里為止都和預(yù)期的一樣,我之后還嘗試了將 UWP 應(yīng)用移植到 WinUI ,基本上只需要將 Windows.UI 命名空間改為 Microsoft.UI就可以了,XAML 和 C# 代碼完全不用變。只可惜目前 WinUI 還很簡(jiǎn)陋,Win2D、Community Toolkit 等微軟自己發(fā)布的 UWP 包都還沒(méi)有 WinUI 版本。而且沒(méi)有設(shè)計(jì)視圖,XAML 視圖也沒(méi)有智能感知,現(xiàn)在想要用 WinUI做些什么有趣的項(xiàng)目會(huì)很困難。不過(guò)從目前的移植難度上來(lái)看,將來(lái)正式發(fā)布后應(yīng)該可以完整地將 UWP 的 UI 的開(kāi)發(fā)經(jīng)驗(yàn)運(yùn)用在 WinUI 上。

      4. 和 WPF 及 UWP 進(jìn)行對(duì)比#

      既然 WinUI 3 開(kāi)發(fā)模式和 WPF 及 UWP 都很像,我當(dāng)然對(duì)它們之間的對(duì)比很感興趣。

      命名#

      首先說(shuō)說(shuō)命名,“WinUI” 光這個(gè)名字就 Win 了。 “UWP” 太高雅,我敢打賭國(guó)內(nèi)有些 UWP 的開(kāi)發(fā)(例如我)都不能好好地把 UWP 的全稱(chēng)拼出來(lái);“WPF” 好些,但 WPF 的含義也讓人很疑惑。而 Windows UI 簡(jiǎn)稱(chēng) WinUI ,意義和發(fā)音都很清晰明確。不過(guò)這三個(gè)都比很多人都不會(huì)讀的 “Xamarin” 強(qiáng)多了。

      可是有了 WinUI 3 ,就會(huì)有人問(wèn)“那 WinUI 2 呢?”WinUI 2是一個(gè) UWP 的控件庫(kù),當(dāng)然的只能用在 UWP 上。這就很尷尬了,WinUI 的 3 和 2 根本不是同一個(gè)概念,實(shí)在很容易讓人混淆,說(shuō)不定以后會(huì)把后綴的 3 去掉(我這篇文章就常常懶得理寫(xiě)這個(gè)3)。而且 UWP 中代碼的命名空間以 Windows.UI 開(kāi)頭,在 WinUI 3 中則 Microsoft.UI ,按著 Office 365 改名為 Microsoft 365、Bind Ads 改名為 Microsoft Advertising 這些經(jīng)驗(yàn),該不會(huì)以后 WinUI 可能改名為 Microsoft UI ,簡(jiǎn)稱(chēng) MiUI 吧?

      權(quán)限#

      權(quán)限方面是 WinUI 的一個(gè)亮點(diǎn),因?yàn)樗举|(zhì)上就是個(gè) Win32 程序,可以放開(kāi)手腳隨便來(lái)。相對(duì)的 UWP 有很?chē)?yán)格的權(quán)限限制,開(kāi)發(fā) UWP 時(shí)常常會(huì)感到綁手綁腳。例如下面這段代碼,大部分 WPF 開(kāi)發(fā)者都難以想象只是最小化 UWP 程序而已,它就不能好好運(yùn)行了:

      Copy

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

      UWP 的生命周期如上圖,當(dāng) UWP 處于 background 運(yùn)行或 suspended 狀態(tài)時(shí)應(yīng)用基本處于暫停狀態(tài),也也不會(huì)處理UI功能。我明白這是 UWP 為了省電、安全等原因才這樣設(shè)計(jì),但對(duì)開(kāi)發(fā)人員來(lái)說(shuō)真的太不方便。而 WinUI 應(yīng)用基本上就是個(gè) Win32 應(yīng)用,目前看來(lái)不會(huì)有這些坑。

      開(kāi)發(fā)體驗(yàn)#

      說(shuō)起開(kāi)發(fā)體驗(yàn),WPF 好歹還算正常,Visual Studio 的設(shè)計(jì)視圖運(yùn)行正常,編譯起來(lái)也快。UWP 編譯很慢,設(shè)計(jì)視圖經(jīng)常出問(wèn)題,Blend 也時(shí)好時(shí)壞把設(shè)計(jì)師都?xì)馀芰恕>退阃耆粗俜降奈臋n完成一個(gè) UWP App,甚至一行代碼都不改,發(fā)布到商店后還是有可能崩潰。而對(duì)于應(yīng)用商店,真是千言萬(wàn)語(yǔ)匯聚成一個(gè)草花頭。

      現(xiàn)在 WinUI 的 XAML 視圖連智能感知都沒(méi)有,也沒(méi)有設(shè)計(jì)視圖,實(shí)在沒(méi)法談開(kāi)發(fā)體驗(yàn)。很難猜測(cè)正式發(fā)布的時(shí)候會(huì)怎么樣,希望至少和WPF保持一致吧。

      性能#

      WPF 總是給人“慢”的印象,除了因?yàn)樵谒鼊偝鰜?lái)的時(shí)候(10年前)電腦性能不夠?qū)е铝粝铝丝贪逵∠螅€有一個(gè)主要原因是:它真的很慢。

      UWP 的 XAML 有很優(yōu)秀的性能表現(xiàn),除此之外為了照顧已經(jīng)不存在的 Windows Phone 的貧弱性能,很多控件模版都經(jīng)過(guò)精心設(shè)計(jì)并大幅簡(jiǎn)化。

      為了驗(yàn)證 WinUI 的性能我寫(xiě)了下面這些代碼,然后分別移植到 WPF .Net Framework 4.8、WPF .NET 5、UWP、WinUI(WPF 和 UWP/WinUI 的代碼稍微有一點(diǎn)不同):

      Copy

      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個(gè)矩形旋轉(zhuǎn),十分考驗(yàn) WPF 的性能。結(jié)果可以說(shuō)出乎意料。

      我的環(huán)境是 i7-6820HQ 及集成顯卡。WPF 平臺(tái)占用 70 多%的 GPU,這我大致能猜到。UWP 十分流暢,GPU 只占用 WPF 的一半,CPU 和 內(nèi)存都有出色表現(xiàn),不過(guò)我還以為會(huì)更低的。

      WinUI 這個(gè)濃眉大眼的我真的萬(wàn)萬(wàn)沒(méi)想到,不僅掉幀明顯,還占用了幾乎 100% GPU,也就是說(shuō)它連這么簡(jiǎn)單的代碼都跑不起來(lái)。()順便一提,將測(cè)試代碼中旋轉(zhuǎn)的矩形減少為10個(gè),WPF 的程序占用 32% GPU,而 WinUI 占用 70 多%。)

      從上面的數(shù)據(jù)基本可以說(shuō)明,WinUI 離設(shè)計(jì)目標(biāo)還十分遙遠(yuǎn),畢竟是預(yù)覽版,還有一年半載可以慢慢優(yōu)化。

      5. 結(jié)語(yǔ)#

      總的來(lái)說(shuō)微軟雄心勃勃,可是現(xiàn)在拿出來(lái)的 WinUI 預(yù)覽版還差得太遠(yuǎn),功能未完善,性能不及預(yù)期。我覺(jué)得大致方向沒(méi)錯(cuò),WinUI 對(duì) C++、WPF、UWP 開(kāi)發(fā)者都是個(gè)新的工具新的機(jī)遇,可以關(guān)注一下。

      6. Q & A#

      Windows 7 怎么辦?#

      按微軟公布的路線圖,再包括跳票等因素,等 WinUI 真正可用時(shí) Windows 7 已停止更新很久,到時(shí) Windows 7 的占有率可能已經(jīng)下降到開(kāi)發(fā)者不會(huì)關(guān)心的程度。

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

      假使不想花精力將現(xiàn)有項(xiàng)目遷移到 WinUI,或者對(duì)來(lái)自 UWP 的 WinUI 沒(méi)信心,又或者舍不得 Windows 7 的用戶,并且對(duì)觸摸沒(méi)需求,當(dāng)然可以繼續(xù)選用 WPF,基于 .NET Core 的 WPF 會(huì)是個(gè)很好的選擇。

      MAUI 還是 WinUI ?#

      MAUI 還在很遙遠(yuǎn)的將來(lái)(2021年11月),我沒(méi)試玩過(guò),所以不好評(píng)價(jià)。如果有跨平臺(tái)需求當(dāng)然只能選 MAUI,如果 WinUI 團(tuán)隊(duì)技高一籌實(shí)現(xiàn)了 MAUI 難以企及的超高性能,那就選 WinUI。不過(guò) MAUI 這個(gè)名字太過(guò)普通/普遍,可能會(huì)被逼著改名吧。

      那 UWP 呢?#

      權(quán)限受限的 UWP 可以說(shuō)是人畜無(wú)害,對(duì)用戶來(lái)說(shuō)可能也是個(gè)不錯(cuò)的選擇。而且 UWP 還支持 Xbox 和 Hololens 等平臺(tái),目前看來(lái)還是有它的市場(chǎng)。

      Winforms 呢?#

      人只有忘卻了過(guò)去,才能好好活著。

      WinUI 有未來(lái)嗎?#

      我做了好多年 Silverlight 開(kāi)發(fā),買(mǎi)了5、6部 Windows Phone 手機(jī),寫(xiě)了幾十篇 UWP 文章,根據(jù)我豐富的經(jīng)驗(yàn),我可以肯定 WinUI 是有未來(lái)的。

      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.cnblogs.com/dino623/p/Get-started-with-WinUI-3-for-desktop-apps.html

      版權(quán):本文采用「CC BY 4.0」知識(shí)共享許可協(xié)議進(jìn)行許可。

      WPF Windows

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:thinkcell甘特圖
      下一篇:報(bào)表中的圖片(或者是文本框)上的數(shù)據(jù)隨著源數(shù)據(jù)變貨而變化,怎么做
      相關(guān)文章
      亚洲一欧洲中文字幕在线| 亚洲人色大成年网站在线观看| 亚洲人成网站色7799| 亚洲乱码日产精品BD在线观看| 亚洲视频在线观看网址| 99久久亚洲综合精品成人网| 亚洲国产精品婷婷久久| 亚洲人成网址在线观看| 亚洲国产美国国产综合一区二区| 亚洲欧洲在线观看| 亚洲人成在线影院| 亚洲人成电影亚洲人成9999网| 亚洲免费在线视频| 亚洲精品视频久久| 亚洲人成综合在线播放| 亚洲一级毛片中文字幕| 亚洲最大天堂无码精品区| 亚洲精品无码专区| 亚洲av成人片在线观看| 亚洲国产综合精品中文字幕| 老司机亚洲精品影视www| 亚洲乱码无码永久不卡在线| 亚洲中文久久精品无码ww16| 亚洲精品美女久久777777| 亚洲Av永久无码精品三区在线| 亚洲AV无码精品色午夜在线观看| 亚洲AV成人精品网站在线播放| 666精品国产精品亚洲| 亚洲国产精品成人精品小说| 中文字幕在线观看亚洲日韩| 亚洲女女女同性video| 久久精品国产亚洲AV未满十八| 亚洲成av人在片观看| 最新亚洲成av人免费看| 国产精品久久久亚洲| 亚洲精品福利网泷泽萝拉| 国产精品亚洲四区在线观看| 亚洲AV永久无码天堂影院| 亚洲国产成人爱av在线播放| 亚洲宅男天堂在线观看无病毒| 亚洲国产成人一区二区精品区|