適用於 .NET 7 的 Windows Forms 新功能
本文說明 .NET 7 中一些新的 Windows Forms 功能和增強功能。
從 .NET Framework 移轉至 .NET 7 時,有一些重大變更需要特別注意。 如需詳細資訊,請參閱 Windows Forms 的重大變更。
高 DPI 改善
使用 PerMonitorV2 的高 DPI 轉譯已改善:
正確調整巢狀控制項。 例如,面板上的按鈕,而該面板位於索引標籤頁面上。
針對執行 Form.MaximumSize 集合至 Form.MinimumSize 的應用程式,根據其目前的監視器 DPI 設定,縮放
ApplicationHighDpiMode
和PerMonitorV2
屬性。在 .NET 7 中,此功能預設為停用,您必須加入宣告才能接收此變更。 從 .NET 8 開始,此功能預設為啟用,您必須退出宣告才能還原為先前的行為。
若要啟用功能,請在
configProperties
中設定 設定:{ "runtimeOptions": { "tfm": "net7.0", "frameworks": [ ... ], "configProperties": { "System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi": true, } } }
協助工具改善和修正
此版本進一步改善協助工具,包括但不限於下列項目:
已解決螢幕助讀程式中觀察到的許多公告相關問題,以確保控制項的相關資訊正確無誤。 例如,ListView 現在會在群組展開或折疊時正確宣告。
更多控制項現在提供使用者介面自動化支援:
已修正在朗讀程式等輔助工具下執行 Windows Forms 應用程式的相關記憶體流失。
輔助工具現在準確地繪製焦點指標,並報告巢狀表單和複合控制項的某些元素的正確周框,例如 DataGridView、ListView 和 TabControl。
自動化使用者介面 ExpandCollapse 控制項模式已在 ListView、TreeView 和 PropertyGrid 控制項中正確實作,而且只會針對可展開的項目啟用。
控制項中的各種色彩對比比例修正。
高對比度主題中 ToolStripTextBox 和 ToolStripButton 的可見度改善。
資料繫結改善 (預覽)
雖然 Windows Forms 已經有強大的繫結引擎,但引進了更現代化的資料繫結形式,類似於 WPF 所提供的資料繫結。
新的資料繫結功能可讓您完全採用 MVVM 模式,而且從 Windows Forms 中的 ViewModels 使用物件關係型對應器時比之前更容易。 進而可減少程式碼後置檔案中的程式碼,並開啟新的測試可能性。 更重要的是,可在 Windows Forms 與其他 .NET GUI 架構之間共用程式碼,例如 WPF、UWP/WinUI 和 .NET MAUI。 為了釐清一個常見問題,目前還沒有任何計劃在 Windows Forms 中引進 XAML。
這些新的資料繫結功能目前為 .NET 7 的預覽版,有關此功能的更多工作將在 .NET 8 中進行。
若要啟用新的繫結,請將 EnablePreviewFeatures
設定新增至專案檔。 C# 和 Visual Basic 都支援此功能。
<Project Sdk="Microsoft.NET.Sdk">
<!-- other settings -->
<PropertyGroup>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
</Project>
下列程式碼片段示範新增至 Windows Forms 中各種類別的新屬性、事件和方法。 雖然下列程式碼範例位於 C# 中,但也適用於 Visual Basic。
public class Control {
[BindableAttribute(true)]
public virtual object DataContext { get; set; }
[BrowsableAttribute(true)]
public event EventHandler DataContextChanged;
protected virtual void OnDataContextChanged(EventArgs e);
protected virtual void OnParentDataContextChanged(EventArgs e);
}
[RequiresPreviewFeaturesAttribute]
public abstract class BindableComponent : Component, IBindableComponent, IComponent, IDisposable {
protected BindableComponent();
public BindingContext? BindingContext { get; set; }
public ControlBindingsCollection DataBindings { get; }
public event EventHandler BindingContextChanged;
protected virtual void OnBindingContextChanged(EventArgs e);
}
public abstract class ButtonBase : Control {
[BindableAttribute(true)]
[RequiresPreviewFeaturesAttribute]
public ICommand? Command { get; set; }
[BindableAttribute(true)]
public object? CommandParameter { [RequiresPreviewFeaturesAttribute] get; [RequiresPreviewFeaturesAttribute] set; }
[RequiresPreviewFeaturesAttribute]
public event EventHandler? CommandCanExecuteChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler? CommandChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler? CommandParameterChanged;
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandCanExecuteChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandParameterChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnRequestCommandExecute(EventArgs e);
}
public abstract class ToolStripItem : BindableComponent, IComponent, IDisposable, IDropTarget {
[BindableAttribute(true)]
[RequiresPreviewFeaturesAttribute]
public ICommand Command { get; set; }
[BindableAttribute(true)]
public object CommandParameter { [RequiresPreviewFeaturesAttribute] get; [RequiresPreviewFeaturesAttribute] set; }
[RequiresPreviewFeaturesAttribute]
public event EventHandler CommandCanExecuteChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler CommandChanged;
[RequiresPreviewFeaturesAttribute]
public event EventHandler CommandParameterChanged;
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandCanExecuteChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnCommandParameterChanged(EventArgs e);
[RequiresPreviewFeaturesAttribute]
protected virtual void OnRequestCommandExecute(EventArgs e);
}
其他改進項目
以下是一些其他值得注意的變更:
- 拖放處理符合 Windows 拖放功能,但具有更豐富的顯示效果,例如圖示和文字標籤。
- 資料夾與檔案對話框有更多選項:
- 新增至最近
- 檢查寫入權限
- 展開模式
- 確定需要互動
- 選取唯讀
- 顯示隱藏的檔案
- 顯示已釘選的位置
- 顯示預覽
- ErrorProvider 現在有 HasErrors 屬性。
- Windows 11 已修正表單的貼齊版面配置。