.NET 5 重大變更系列的最后一個主題是 WPF 和 Windows Forms。這些桌面技術在.NET Core 3.0 之前是不可用的,因為.NET Core 的早期版本主要專注于基于 Web 的應用程式(ASP.NET Core)。
2002 年.NET 首次發布時,Windows Forms(非正式地被稱為 WinForms)是最早的應用程式框架之一。(其他框架包括 WebForms、Console 和 Windows Services。)WinForms 深受 Visual Basic 的影響,和 VB 一樣,它對原生 Windows 控件進行了一層薄薄的包裝。默認情況下,這提供了非常好的性能,但定制能力相當有限。一般來說,開發人員應該允許操作系統處理樣式等方面的東西。
WinForms 的第一個主要變化是在 2005 年發布的.NET 2.0 中出現的,引入了微軟認為低效的各種用戶控件的替代品,包括基本的數據網格。從那時起,這項技術就被認為是“完整的”,唯一的變化是偶爾更新一下,以便支持更高的 DPI。即使是長期存在的 bug 通常也會被忽略,這讓使用 WinForms 進行新項目開發的開發人員感到非常惱火。
Windows Presentation Foundation (WPF)是微軟首次嘗試創建的一個完全可定制的 GUI 框架。雖然只比 WinForms 晚發布了四年,但它還是花了很長一段時間才被普遍接受,因為它的設計模式和概念更為復雜,性能也可能是一個問題。雖然有些技術(如虛擬化)可以使 WPF 在大型數據集上比 WinForms 快得多,但需要更深入的知識才能正確使用它們。此外,很多開發人員認為定制樣式是必需的,因為默認樣式很“丑”。
WPF 有兩個影響深遠的關鍵“特性”,一個是使用 XAML 進行 UI 布局,另一個是使用 MVVM 模式進行數據綁定。這些也被引入到其他項目中,比如 Silverlight 和 Universal Windows Platform。
像 WinForms 一樣,WPF 多年來也一直被認為是“完整的”。它甚至不支持XAML-2009,即使是在 2012 年XAML規范發布之后。作為回應,Avalonia等項目試圖改進 WPF 的缺陷,比如允許將事件直接綁定到模型或視圖模型。
新的 SDK
在.NET Core 3.x 中,WPF 和 WinForms 需要一個叫作 Microsoft.NET.Sdk.WindowsDesktop 的自定義 SDK。在.NET 5 中,使用的是 Microsoft.NET.Sdk,就像其他.NET 5 項目一樣。但現在的目標框架是 net5.0-windows,而不是 net5.0。
隱藏控制臺輸出
絕大多數 WPF 和 WinForms 應用程式不顯示控制臺窗口,這是默認的選項。如果你需要一個地方來顯示額外的診斷資訊,可以將 OutputType 設置為 Exe 而不是 WinExe。
在.NET 5 中,除非你將 DisableWinExeOutputInference 設置為 true,否則 OutputType 設置將被忽略。
錯誤處理的改進
錯誤處理的改進也可能是個重大變更。在.NET Core 3 的 Windows Forms 中,很多驗證代碼根本不存在。這意味著如果你傳入一個無效的參數,它可能會拋出一個 NullReferenceException 或者表現出一種不確定的行為。
在.NET 5 中,它會拋出相應的 ArgumentException、ArgumentNullException 或 ArgumentOutOfRangeException。如果是屬性為空,而不是參數為空,那么將拋出 InvalidOperationException。
有關如何正確使用異常,請參見.NET中的異常設計。
移除狀態欄控件
我們在上面討論 WinForms 的歷史,是為了解釋狀態欄控件都發生了什么。在.NET Framework 2 中被替換的一個控件是不起眼的StatusBar。在.NET 2 中是StatusStrip,它們的作用是一樣的。
微軟沒有解釋為什么要移除它,所以對于一個大多數人都不知道的控制,其維護成本太高了。StatusBar 在設計器工具箱中已經很久不可見了,在.NET 5 中已經被移除了。
本系列其他文章
原文鏈接:
.NET 5 Breaking Changes for WPF/Windows Forms