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