.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 窗体。

接口 IBindableComponentBindableComponent 类驱动新的绑定系统。 Control 实现接口并向 Windows 窗体提供新的数据绑定功能。

按钮命令

按钮命令在 .NET 7 中处于预览状态,现在已在 .NET 8 中完全启用。 与 WPF 类似,可以将实现 ICommand 接口的对象实例分配给按钮的 Command 属性。 单击按钮时,将调用该命令。

通过为按钮的 CommandParameter 属性指定值,可以在调用命令时提供可选参数。

CommandCommandParameter 属性可通过设计器中的“属性”窗口进行设置(“(DataBindings)”下),如下图所示。

Visual Studio 属性窗口突出显示 Windows 窗体的按钮命令和 CommandParameter 属性。

按钮还侦听 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.MaximumSizeForm.MinimumSize 属性。

    从 .NET 8 开始,此功能默认启用,你需要选择退出此功能,才能还原以前的行为。

    若要禁用该功能,请将 System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi 添加到 configProperties 中的 设置,并将值设置为 false:

    {
      "runtimeOptions": {
        "tfm": "net8.0",
        "frameworks": [
            ...
        ],
        "configProperties": {
          "System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi": false,
        }
      }
    }
    

其他改进

下面是一些其他值得注意的变更: