什么是WinUI

Windows UI庫 (WinUI) 是適用于 Windows 桌面應用程式和 UWP 應用程式的本機用戶體驗 (UX) 框架,
WinUI is a user interface layer that contains modern controls and styles for building Windows apps. As the native UI layer in Windows it embodies Fluent Design, giving each Windows app the polished feel that customers expect.
?WinUI是一個用戶界面層,包含用于構建Windows應用的現代控制元件和樣式,??作為Windows中的原生UI層,它體現了??流暢的設計??,為每個Windows應用提供了客戶所期望的拋光感覺,?
通俗一點理解,WinUI將UWP的UI層從Windows SDK的其它部分分離,并將從Windows轉移到Nuget,現在建一個C++或C#(.NET 5)程式,再從Nuget上裝個WinUI 3的包套個UI層,一個基于Fluent Design,觸摸友好,性能無與倫比的應用程式就誕生了,
什么是WinUI 3
Windows UI庫(WinUI)3是用于構建新式Windows應用的原生用戶體驗(UX)平臺,WinUI 3的此預覽版既適用于桌面/Win32應用,也適用于UWP應用,并且包含VisualStudio專案模板和NuGet包,前者有助于你開始使用基于WinUI的用戶界面構建應用,后者包含WinUI庫,
從下圖中,可以看出UI Framework技術的演進:
1992年的MFC -> 2002年的WinForms -> 2006年的WPF -> 2012年的UWP+Win UI2 Library,最終迎來了我們今天的主角WinUI 3(3rd generation of WinUI),

從WinUI 2到WinUI 3:
WinUI 2.x可以在UWP應用程式中使用,并可通過XAML Islands納入到新的或現有的桌面應用程式中,

WinUI 3 Project Reunion 0.5是WinUI 3的第一個穩定的支持版本, 利用此版本的WinUI 3,可創建生產應用并將其發布到Microsoft Store,

WinUI 3路線圖

控制元件和特性
*Coming to a future version of WinUI 3.**Work in progress.
| 兼容性/特性 | WinUI 3 | UWP XAML & WinUI 2 | WPF | WinForms | MFC |
|---|---|---|---|---|---|
| Windows app types supported | UWP (Preview) and Win32 | UWP | Win32 | Win32 | Win32 |
| Windows versions supported | Windows 10 (1809+) | Windows 10 (1703+) | Windows XP or higher | Windows XP or higher | Windows XP or higher |
| Supported on all Windows device families | √* | √ | |||
| Native C/C++ | √ | √ | √ | ||
| .NET 5 Support | √ | √ | √ | ||
| WebView2 (Chromium-based engine) | √ | √** | √** | ||
| Built-in Fluent Design controls | √ | √ | |||
| Built-in support for modern input (e.g. touch, pen, gamepad*) | √ | √ | |||
| Uses latest DirectX version for graphics performance | √ | √ | |||
| High performance data binding (x:Bind) | √ | √ | |||
| Input Validation | √ | √ | √ | √ |
WinUI 3 - Project Reunion 0.5
WinUI 3-ProjectReunion 0.5預覽版是WinUI 3的第一個版本,在ProjectReunion包中提供,除了這項更改之外,此預覽版本還包含一些關鍵的bug修復、更高的穩定性以及其他一些常規改進,
此WinUI 3預覽版用于早期評估以及從開發人員社區收集反饋, 它不應該用于生產應用,
我們預計將在3月下旬發布Project Reunion 0.5,其中包含WinUI 3的第一個穩定受支持版本,
Project Reunion - Calling all Windows apps
Project Reunion 是一組新的開發人員組件和工具,它們代表著 Windows 應用開發平臺的下一步發展, Project Reunion 提供了一組統一的 API 和工具,各種目標 Windows 10 OS 版本上的任何桌面應用都能夠一致地使用它們,
Project Reunion 不會替代現有的桌面 Windows 應用平臺和框架,例如 .NET(包括 Windows 表單和 WPF)和 C++/Win32, 而是通過一組通用的 API 和工具(開發人員可以在這些平臺中使用)來對這些現有平臺進行補充,

- https://github.com/microsoft/ProjectReunion
在生產環境中,支持在 MSIX 打包桌面應用(C#/.NET 5 或 C++/Win32)中使用 Project Reunion 0.5, 可將使用 Project Reunion 0.5 的打包桌面應用發布到 Microsoft Store, 對于 UWP 應用,Project Reunion 0.5 僅作為預覽版提供, 生產環境中使用的 UWP 應用不支持此版本,
Project Reunion 0.5 包含以下可在應用中使用的 API 和組件集
| 組件 | 說明 |
|---|---|
| WindowsUI庫3 | WindowsUI庫(WinUI)3是適用于Windows應用的下一代Windows用戶體驗(UX)平臺, 此版本包含VisualStudio專案模板和NuGet包,前者有助于你開始使用基于WinUI的用戶界面構建應用,后者包含WinUI庫, |
| 使用MRTCore管理資源 | MRTCore提供API來加載和管理你的應用所使用的資源, MRTCore是新式 Windows資源管理系統的簡化版本, |
| 使用DWriteCore呈現文本 | 通過DWriteCore,你可以獲取用于呈現文本的所有當前DirectWrite功能,包括與設備無關的文本布局系統、硬體加速文本、多格式文本和廣泛的語言支持, |
面向Windows開發人員的Project Reunion優勢
Project Reunion提供了各種Windows API,其實作與OS分離,并通過NuGet包發布給開發人員,Project Reunion并不打算替換Windows SDK,Windows SDK將繼續按原樣作業,并且Windows的許多核心組件將通過API不斷改進,這些API通過OS和Windows SDK版本發布,建議開發人員按照自己的進度采用Project Reunion,
在不同的桌面應用平臺中實作統一的API圖面
想要創建桌面Windows應用的開發人員必須在多個應用平臺和框架之間進行選擇,盡管每個平臺都提供了許多可供使用其他平臺構建的應用使用的功能和API,但是某些功能和API僅供特定平臺使用,Project Reunion統一了所有桌面Windows 10應用對Windows API的訪問,無論選擇哪種應用模型,你都可以訪問ProjectReunion中提供的同一組Windows API,
隨著時間的推移,我們計劃對Project Reunion進行進一步的投資,以減少不同應用模型之間的差異,Project Reunion將同時提供WinRT API和本機CAPI,
在多個Windows 10版本中實作一致的支持
隨著Windows API隨新OS版本的發展而不斷發展,開發人員必須使用版本自適應代碼等技術來解決版本中的所有差異,以吸引其應用程式受眾,這可能會增加代碼和開發體驗的復雜性,
Project Reunion API適用于Windows 10版本1809以及Windows 10的所有更高版本,這意味著,只要你的客戶使用的是Windows 10版本1809或任何更高版本,就可以在新的Project Reunion API和功能發布后立即使用,而無需撰寫版本自適應代碼,
加快發布節奏
新的Windows API和功能通常與每年以一次或兩次的節奏發布的OS版本相關,Project Reunion將以更快的節奏發布更新,使你能夠在創建Windows開發平臺后更早、更快地訪問這些創新,
ASTA到STA執行緒模型
如果要將代碼從現有UWP應用遷移到使用Project Reunion的新C#/.NET5或C++/Win32/WinUI3專案,請注意,新專案使用單執行緒單元(STA)執行緒模型,而不是UWP應用使用的應用程式STA(ASTA)執行緒模型,如果代碼采用ASTA執行緒模型的非可重入行為,則代碼可能不會按預期方式運行,
WinUI 3控制元件庫
查看WinUI 3控制元件庫(以前稱為 XAML控制元件庫 - WinUI 3版本)以獲取示例應用,該示例應用包含屬于WinUI 3 Project Reunion 0.5的所有控制元件和功能,

git clone --single-branch --branch winui3 https://github.com/microsoft/Xaml-Controls-Gallery.git
git checkout winui3
開發環境要求
1. 確保開發計算機上已安裝Windows 10版本1809(內部版本17763)或更高版本的OS,

2. 如果尚未安裝Visual Studio 2019版本16.10預覽版(或更高版本),請先安裝,

1)安裝Visual Studio時,必須包含以下組件:
- 在安裝對話框的“作業負載”選項卡上,確保選擇了“通用 Windows 平臺開發”,
- 在安裝對話框的“單個組件”選項卡上,確保在“SDK、庫和框架”部分選擇了Windows 10 SDK(10.0.19041.0),


2)要構建.NET應用,還必須包含以下組件:
- 在安裝對話框的“作業負載”選項卡上,確保選擇了“.NET桌面開發”,

3)要構建C++應用,還必須包含以下組件:
- 在安裝對話框的“作業負載”選項卡上,確保選擇了“C++桌面開發”,
- 在安裝對話框右側的“安裝詳細資訊”窗格中,確保在“通用Windows平臺開發”部分選擇了“C++(v142)通用Windows平臺工具”可選組件,


3. 如果以前安裝了VisualStudio的WinUI3預覽版擴展,請卸載該擴展,

4. 請確保系統中已為正式NuGet服務索引啟用了NuGet包源https://api.nuget.org/v3/index.json,
a. 在VisualStudio中,選擇"工具""->NuGet包管理器->包管理器設定"以打開"選項"對話框,
b. 在"選項"對話框的左窗格中,選擇"包源"選項卡,并確保將指向的nuget.org的包源https://api.nuget.org/v3/index.json作為源URL,
5. 下載并安裝適用于VisualStudio的專案Project Reunion 0.5擴展,擴展有兩個版本:一個用于桌面(c#/.NET5或c++/WinRT)應用,另一個用于UWP應用,
Project Reunion 0.5 發行版有兩個可用的 Visual Studio 擴展:Project Reunion VSIX 和 Project Reunion 預覽 VSIX , Project Reunion VSIX 包含可用于生成 MSIX 打包桌面生產應用的專案模板, Project Reunion 預覽 VSIX 包含可用于生成 MSIX 打包桌面應用或 UWP 應用的實驗性專案模板,
若要在desktop中使用Project Reunion(c#/.NET5或c++/WinRT)應用:
- 在VisualStudio2019中,單擊“擴展”>“管理擴展”,搜索
Project Reunion,然后安裝Project Reunion擴展, - 或者,可以直接從Visual Studio Marketplace下載并安裝專案Project Reunion 0.5擴展,


若要在UWP應用中使用Project Reunion,你必須安裝不支持在生產環境中使用的擴展預覽版本:
- 卸載專案的任何現有版本,
- 在VisualStudio2019中,單擊"擴展"">管理擴展",然后單擊左下角的"更改擴展設定",安裝舊版本之前,請關閉為所有用戶安裝的包的自動更新,
- 下載并安裝專案
Project Reunion 0.5預覽擴展,

安裝完成之后,我們新建專案就能看到關于WinUI 3的新專案模板了,

6. 若要在Visual Studio 2019 16.10 Preview中使用WinUI 3工具(如"實時可視化樹"、"熱多載"和"實時屬性資源管理器"),必須使用Visual Studio預覽功能啟用WinUI 3工具,
- Navigate to the Preview Features page by going to Tools -> Options -> Environment -> Preview Features
- Click on "Enable UI Debugging Tooling for WinUI 3 Projects"
- Click on OK
7. 若要接收來自最新穩定版本的專案Project Reunion 0.5的所有修補程式,需要將.NET SDK顯式設定為最新版本,為此,請將以下項組添加到.csproj檔案中,并保存專案,
<ItemGroup>
<FrameworkReference Update="Microsoft.Windows.SDK.NET.Ref" RuntimeFrameworkVersion="10.0.18362.16" />
<FrameworkReference Update="Microsoft.Windows.SDK.NET.Ref" TargetingPackVersion="10.0.18362.16" />
</ItemGroup>
8. 如果你在使用擴展應用Reshaper,建議最好更新到最新版為好
- JetBrains.dotUltimate.2021.1.1.exe

創建使用Project Reunion的新專案
適用于Visual Studio 2019(包含適用于"桌面應用"和"UWP應用的預覽擴展"的擴展的專案"0.5擴展")提供使用基于WinUI 3的UI層生成專案的專案模板,并提供對所有其他專案的所有其他Api的訪問權限,
支持在生產環境中使用的桌面 (c #/.NET 5 和 c + +/WinRT) 專案模板, UWP 專案模板僅作為開發人員預覽版提供,不能用于生成適用于生產環境的應用,

創建專案后,除了桌面和 UWP 應用常用的所有其他 Windows 和 .NET API 之外,你還可以使用以下 Project Reunion API 和組件
- Windows UI 庫 3: https://docs.microsoft.com/zh-cn/windows/apps/winui/winui3/
- 使用 MRT Core 管理資源: https://docs.microsoft.com/zh-cn/windows/apps/project-reunion/mrtcore/mrtcore-overview
- 使用 DWriteCore 呈現文本: https://docs.microsoft.com/zh-cn/windows/apps/project-reunion/dwritecore
創建適用于C#和.NET 5的WinUI 3桌面應用
1. 打開Visual Studio 2019 Preview 16.10,選擇創建新專案,

2. 選擇一個基于WinUI 3桌面的空白模板,

3. 輸入專案名字demoDesktopInWinUi3,點擊創建按鈕,

4. 在下面的對話框中,將“目標版本”設定為Windows 10 版本 2004(內部版本 19041),并將“最低版本”設定為Windows 10 版本 1809(內部版本 17763),然后單擊“確定” ,
因為WinUI框架最低要求1809版本的Windows10,

5. 接下來,很快會創建好解決方案和兩個對應的專案,其中,
- 專案名稱(桌面):此專案包含應用的代碼,
App.xaml檔案和App.xaml.cs和代碼隱藏檔案定義了一個Application類,它表示你的應用實體,MainWindow.xaml檔案和MainWindow.xaml.cs代碼隱藏檔案定義了一個MainWindow類,它表示你的應用顯示的主視窗,這些類派生自WinUI提供的Microsoft.UI.Xaml命名空間中的型別,

- 專案名稱(程式包):這是一個
Windows 應用程式打包專案,已配置該專案以將應用生成到MSIX包中, 這提供了一種新式部署體驗、通過包擴展與Windows 10功能集成的功能以及更多其他功能, 此專案包含應用的程式包清單,默認情況下它是你的解決方案的啟動專案,

6. 若要向應用專案中添加新項,請在解決方案資源管理器中右鍵單擊“專案名稱(桌面)”專案節點,然后選擇“添加” -> “新項”, 在“添加新項”對話框中,選擇“WinUI”選項卡,選擇要添加的項,然后單擊“添加”,

7. 生成并運行解決方案,確認應用運行時不會出錯,
第一次編譯,就遇到一個報錯,This version of Project Reunion requires WinRT.Runtime.dll version 1.2 or greater,差點慌了,

根據微軟給的提示,就兩條路,要么升級.Net SDK到v5.0.6版本,我查了下我自己的,才v5.0.3,我還以為真的有新版本,結果到下載頁一看,傻眼了,最新版不也就才到v5.0.5,哪來的v5.0.6,差點走偏,

后來,突然反映過來,這個關于Microsoft.Windows.SDK.NET.Ref FrameworkReference的提示很眼熟,哦,原來就是前面提到的開發環境中第7點,果然就是它,那肯定就靠你了,大兄弟,
用Visual Studio Code打開當前目錄,找到“專案名稱(桌面)”專案的.csproj,在ItemGroup節點中,插入:
<FrameworkReference Update="Microsoft.Windows.SDK.NET.Ref" RuntimeFrameworkVersion="10.0.18362.16" />
<FrameworkReference Update="Microsoft.Windows.SDK.NET.Ref" TargetingPackVersion="10.0.18362.16" />

保存后,回到專案一看,重新生成所有,完事,就這么好了,

8. 廢話少說,Ctrl+F5,運行吧,

構建基本的WinUI 3桌面應用
應用程式解決方案
默認情況下,該解決方案包含兩個專案:應用程式本身以及用于創建.msix應用包的另一個專案,
當前需要
MSIX應用包才能將使用Project Reunion 0.5的應用部署到其他計算機,但是,未來版本的Project Reunion將支持部署未打包應用,

應用程式專案
雙擊應用程式專案檔案(或右鍵單擊并選擇“編輯專案檔案”),這樣便會在XML文本編輯器中打開該檔案,

我們可以看到TargetFramework是指定為net5.0-windows10.0.19041了,今后這是.NET的主要實作,
還有,ItemGroup節點下,各種Project Reunion功能的NuGet PackageReference元素,包括WinUI,
MainWindow.xaml檔案

XAML Window類已擴展為支持桌面視窗,從而轉換為UWP和桌面應用模型所使用的每個低級別視窗實作的抽象, 具體而言,UWP使用CoreWindow,而Win32使用視窗句柄(或稱HWND)和相應的Win32 API,
從托管的托管C#/.NET 5應用呼叫原生函式
在解決方案上右鍵,選擇管理解決方案的Nuget包,搜索PInvoke.User32,將PInvoke.User32安裝到專案名稱(桌面)中,

前往App.xaml.cs中,定義MainWindowWindowHandle接收當前程式的句柄,在OnLaunched函式中獲取當前程式句柄,
若要獲取視窗句柄,請使用
GetActiveWindow方法, 此方法回傳當前活動視窗的視窗句柄(在激活目標視窗之后呼叫此方法),
/// <summary>
/// Invoked when the application is launched normally by the end user. Other entry points
/// will be used such as when the application is launched to open a specific file.
/// </summary>
/// <param name="args">Details about the launch request and process.</param>
protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
m_window = new MainWindow();
m_window.Activate();
m_windowhandle = PInvoke.User32.GetActiveWindow();
}
private Window m_window;
IntPtr m_windowhandle;
public IntPtr MainWindowWindowHandle { get { return m_windowhandle; } }

然后前往MainWindow.xaml.cs中,找到myButton_Click事件,追加邏輯,通過呼叫原生函式來實作當前表單的最大化動作,
private void myButton_Click(object sender, RoutedEventArgs e)
{
myButton.Content = "Clicked";
IntPtr hwnd = (App.Current as App).MainWindowWindowHandle;
PInvoke.User32.ShowWindow(hwnd, PInvoke.User32.WindowShowStyle.SW_MAXIMIZE);
}

編譯并運行應用,按“單擊我”按鈕,應用視窗應最大化,
以完全信任權限模式運行桌面應用
WinUI 3提供了一種功能,使應用程式能夠在AppContainer的安全沙盒以外以“完全信任權限”運行,
在UWP應用的時候,我們總是會默認以受限制的方式運行,而基于WinUI 3的不會,接下來的舉個例子:
將MainWindow.xaml檔案的內容改為:
<StackPanel
Orientation="Horizontal"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<Button x:Name="myButton" Click="myButton_Click">Click Me</Button>
<ContentDialog x:Name="contentDialog" CloseButtonText="Close">
<StackPanel>
<TextBlock Name="cdTextBlock"/>
</StackPanel>
</ContentDialog>
</StackPanel>

然后前往MainWindow.xaml.cs中,找到myButton_Click事件,追加邏輯,從System.Diagnostics呼叫.NET API以獲取當前行程中加載的模塊,回圈訪問Process.Modules物件中的每個ProcessModule,
private async void MyButton_Click(object sender, RoutedEventArgs e)
{
myButton.Content = "Clicked";
var description = new System.Text.StringBuilder();
var process = System.Diagnostics.Process.GetCurrentProcess();
foreach (System.Diagnostics.ProcessModule module in process.Modules)
{
description.AppendLine(module.FileName);
}
cdTextBlock.Text = description.ToString();
await contentDialog.ShowAsync();
}
編譯并運行應用,按“單擊我”按鈕,對話框應顯示行程串列,

參考
- WinUI - The modern native UI platform of Windows.
- About WinUI
- Windows UI Library Roadmap
- Windows UI 庫 3 - Project Reunion 0.5 預覽版(2021 年 3 月)發行說明
- https://github.com/microsoft/ProjectReunion
- Announcing Project Reunion 0.5!
- Project Reunion 0.5 - Available now!
- 使用 Project Reunion 0.5 構建桌面 Windows 應用
- Project Reunion Roadmap
- Project Reunion 入門
- 部署使用專案配置的應用
- https://www.jetbrains.com/resharper/
- Fluent Design System
- Visual Studio 2019 v16.10 Preview 發行說明
- Visual Studio 2019 版本 16.10 預覽版 2
- 適用于桌面應用的 WinUI 3 入門
- 生成基本的 WinUI 3 - Project Reunion 0.5 桌面應用
- WinUI 3 控制元件庫
- Visual Studio 中的 WinUI 3 專案模板
- Download .NET 5.0
- What's new in .NET 5
- Enterprise development futures: Project Reunion
- WinUI 3 試玩報告
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/277604.html
標籤:UWP
