.NET 8 Windows 窗体中的新增功能
本文介绍 .NET 8 中一些新的 Windows 窗体功能和增强功能。
从 .NET Framework 迁移到 .NET 8 时,应注意一些中断性变更。 有关详细信息,请参阅 Windows 窗体中的重大更改。
数据绑定改进
新的数据绑定引擎在 .NET 7 中处于预览状态,现在已在 .NET 8 中完全启用。 尽管与现有的 Windows 窗体数据绑定引擎不一样广泛,但此新引擎在 WPF 之后建模,因此可以更轻松地实现 MVVM 设计原则。
增强的数据绑定功能使充分利用 MVVM 模式和在 Windows 窗体中使用 ViewModels 中的对象关系映射器变得更加简单。 这减少了代码隐藏文件中的代码量。 更重要的是,它支持在 Windows 窗体和其他 .NET GUI 框架(如 WPF、UWP/WinUI 和 .NET MAUI)之间共享代码。 请务必注意,虽然前面提到的 GUI 框架使用 XAML 作为 UI 技术,但 XAML 不会进入 Windows 窗体。
接口 IBindableComponent 和 BindableComponent 类驱动新的绑定系统。 Control 实现接口并向 Windows 窗体提供新的数据绑定功能。
按钮命令
按钮命令在 .NET 7 中处于预览状态,现在已在 .NET 8 中完全启用。 与 WPF 类似,可以将实现 ICommand 接口的对象实例分配给按钮的 Command 属性。 单击按钮时,将调用该命令。
通过为按钮的 CommandParameter 属性指定值,可以在调用命令时提供可选参数。
Command
和 CommandParameter
属性可通过设计器中的“属性”窗口进行设置(“(DataBindings)”下),如下图所示。
按钮还侦听 ICommand.CanExecuteChanged 事件,这会导致控件查询 ICommand.CanExecute 方法。 当该方法返回 true
时,将启用控件;返回 false
时则禁用该控件。
Visual Studio DPI 改进
Visual Studio 2022 17.8 推出了不感知 DPI 的设计器选项卡。 以前,Visual Studio 中的“Windows 设计器”选项卡以 Visual Studio 的 DPI 运行。 这会导致设计不感知 DPI 的 Windows 窗体应用时出现问题。 现在,无论感知 DPI 与否,都可以确保设计器以与你希望应用运行的规模相同的规模运行。 在引入此功能之前,你不得不在不感知 DPI 的模式下运行 Visual Studio,这使得在 Windows 中应用缩放时 Visual Studio 本身变得模糊。 现在,你可以单独离开 Visual Studio,让设计器在不感知 DPI 的情况下运行。
可以通过向项目文件添加 <ForceDesignerDPIUnaware>
并将值设置为 true
,来为 Windows 窗体项目启用不感知 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
添加到configProperties
中的 设置,并将值设置为 false:{ "runtimeOptions": { "tfm": "net8.0", "frameworks": [ ... ], "configProperties": { "System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi": false, } } }
其他改进
下面是一些其他值得注意的变更:
- 改进了处理
FolderBrowserDialog
的代码,修复了一些内存泄漏。 - Windows 窗体的代码库一直在缓慢地启用 C# 为 Null 性,从而消除了任何潜在的 null 引用错误。
System.Drawing
源代码已迁移到 Windows 窗体 GitHub 存储库。- 新式 Windows 图标可以通过新 API System.Drawing.SystemIcons.GetStockIcon 访问。 System.Drawing.StockIconId 枚举列出了所有可用的系统图标。
- 现在,运行时可以使用更多设计器。 有关详细信息,请参阅 GitHub 问题 #4908。