適用於 .NET 8 的 Windows Forms 新功能
本文說明 .NET 8 中的一些新的 Windows Forms 功能和增強功能。
從 .NET Framework 移轉至 .NET 8 時,您應該注意幾項重大變更。 如需詳細資訊,請參閱 Windows Forms 的重大變更。
資料繫結改進項目
新的資料繫結引擎在 .NET 7 中尚處於預覽狀態,目前已在 .NET 8 中完全啟用。 雖然規模不如現有的 Windows Forms 資料繫結引擎廣泛,但這個新引擎是以 WPF 為模型,方便您更輕鬆實作 MVVM 設計原則。
增強型資料繫結功能可讓您更輕鬆善加運用 MVVM 模式,並透過 Windows Forms 的 ViewModels 使用物件關係型對應器。 這樣可減少程式碼後置檔案中的程式碼數量。 更重要的是,可在 Windows Forms 與其他 .NET GUI 架構 (例如 WPF、UWP/WinUI 和 .NET MAUI) 之間共用程式碼。 請務必注意,雖然先前提及的 GUI 架構會使用 XAML 作為 UI 技術,但 XAML 不會傳入 Windows Forms。
介面 IBindableComponent 和類別 BindableComponent 會驅動新的繫結系統。 Control 會實作介面,並將新的資料繫結功能提供給 Windows Forms。
按鈕命令
按鈕命令在 .NET 7 中尚處於預覽狀態,目前已在 .NET 8 中完全啟用。 與 WPF 類似,實作 ICommand 介面的物件執行個體可指派給按鈕的 Command 屬性。 按下按鈕後,會叫用該命令。
指定該按鈕 CommandParameter 屬性的值後,即可在叫用命令時提供選擇性參數。
Command
和 CommandParameter
屬性位於 (DataBindings) 底下,並透過 [屬性] 視窗在設計工具中進行設定,如下圖所示。
Buttons 也會接聽 ICommand.CanExecuteChanged 事件,導致控制項查詢 ICommand.CanExecute 方法。 在該方法傳回 true
時,系統會啟用控制項;而在傳回 false
時,控制項則會停用。
Visual Studio DPI 改進項目
Visual Studio 2022 17.8 引進了非 DPI 感知設計工具索引標籤。 先前,Visual Studio 中的 [Windows 設計工具] 索引標籤會在 Visual Studio 的 DPI 上執行。 在設計非 DPI 感知 Windows Forms 應用程式時,這會導致問題。 您現在可確保設計工具會採取期望應用程式執行的相同縮放比例,無論是否使用 DPI 感知模式。 推出這項功能之前,您必須以非 DPI 感知模式來執行 Visual Studio,這讓 Visual Studio 本身在 Windows 中套用縮放比例時變得模糊。 現在起,您可以放手交給 Visual Studio,讓設計工具執行非 DPI 感知模式。
您可以將 <ForceDesignerDPIUnaware>
新增至專案檔,並將值設定為 true
,以啟用 Windows Forms 專案的非 DPI 感知設計工具。
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<ForceDesignerDPIUnaware>true</ForceDesignerDPIUnaware>
<ApplicationHighDpiMode>DpiUnawareGdiScaled</ApplicationHighDpiMode>
</PropertyGroup>
重要
Visual Studio 會在載入專案時讀取此設定,而不是在專案變更時進行讀取。 變更此設定後,請卸載並重新載入專案,以利 Visual Studio 讀取此設定。
高 DPI 改進項目
使用 PerMonitorV2 的高 DPI 轉譯已改善:
正確調整巢狀控制項。 例如,面板上的按鈕會放置在索引標籤頁面。
根據目前的監視器 DPI 設定,縮放 Form.MaximumSize 和 Form.MinimumSize 屬性。
從 .NET 8 開始,此功能預設為啟用,您必須退出宣告才能還原為先前的行為。
若要停用此功能,請將
System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi
新增至 runtimeconfig.json 中的configProperties
設定,並將值設定為 FALSE:{ "runtimeOptions": { "tfm": "net8.0", "frameworks": [ ... ], "configProperties": { "System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi": false, } } }
其他改進項目
以下是一些其他值得注意的變更:
- 已改善處理
FolderBrowserDialog
的程式碼,並修正一些記憶體流失問題。 - Windows Forms 的程式碼基底已慢慢啟用 C# 可 Null 性,並找出任何潛在的 Null 參考錯誤。
System.Drawing
原始程式碼已移轉至 Windows Forms GitHub 存放庫。- 新 API System.Drawing.SystemIcons.GetStockIcon 可存取新的 Windows 圖示。 System.Drawing.StockIconId 列舉類型會列出所有可用的系統圖示。
- 現在,執行階段有更多設計工具可供使用。 如需詳細資訊,請參閱 GitHub 問題 #4908。