适用于 .NET 6 的 Windows 窗体的新增功能

本文介绍 .NET 6 中一些新的 Windows 窗体功能和增强功能。

从 .NET Framework 迁移到 .NET 6 时,应注意一些重大更改。 有关详细信息,请参阅 Windows 窗体中的中断性变更

更新了用于 C# 的模板

.NET 6 引入了许多针对标准控制台应用程序模板的更改。 根据这些更改,用于 C# 的 Windows 窗体模板已更新为默认支持 global using 指令文件范围的命名空间可以为 null 的引用类型

新 C# 模板的一个特性是顶级语句,而这一特性没有在 Windows 窗体中继续沿用。 典型的 Windows 窗体应用程序需要 [STAThread] 属性,并且由跨多个文件拆分的多个类型组成(例如设计器代码文件),因此使用顶级语句没有任何意义

新应用程序启动

生成新 Windows 窗体应用程序的模板会创建一个 Main 方法,该方法在你的应用程序运行时用作应用程序的入口点。 此方法包含配置 Windows 窗体并显示第一个窗体的代码,称为启动代码:

class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

在 .NET 6 中,这些模板已修改为使用 ApplicationConfiguration.Initialize 方法调用的新启动代码。

class Program
{
    [STAThread]
    static void Main()
    {
        ApplicationConfiguration.Initialize();
        Application.Run(new Form1());
    }
}

此方法在编译时自动生成,并包含用于配置 Windows 窗体的代码。 项目文件现在也可以控制这些设置,使你可以避免在代码中对它进行配置。 例如,生成的方法类似于以下代码:

public static void Initialize()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.SetHighDpiMode(HighDpiMode.SystemAware);
}

Visual Studio 使用新的启动代码来配置 Windows 窗体可视化设计器。 如果选择通过恢复旧代码并绕过ApplicationConfiguration.Initialize方法来不使用新的引导代码,Windows 窗体可视化设计器将不会遵循你所设置的引导设置。

Initialize 方法中生成的设置由项目文件控制。

项目级应用程序设置

为补充 Windows 窗体的新应用程序启动功能,应在项目文件中设置以前在应用程序的启动代码中设置的一些 Application 设置。 项目文件可以配置以下应用程序设置:

项目设置 默认值 相应的 API
ApplicationVisualStyles true Application.EnableVisualStyles
应用程序使用兼容文本渲染 false Application.SetCompatibleTextRenderingDefault
ApplicationHighDpiMode SystemAware Application.SetHighDpiMode
ApplicationDefaultFont Segoe UI, 9pt Application.SetDefaultFont

以下示例展示了设置这些应用程序相关属性的项目文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net6.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <UseWindowsForms>true</UseWindowsForms>
    <ImplicitUsings>enable</ImplicitUsings>

    <ApplicationVisualStyles>true</ApplicationVisualStyles>
    <ApplicationUseCompatibleTextRendering>false</ApplicationUseCompatibleTextRendering>
    <ApplicationHighDpiMode>SystemAware</ApplicationHighDpiMode>
    <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont>

  </PropertyGroup>

</Project>

Windows 窗体可视化设计器会使用这些设置。 有关详细信息,请参阅 Visual Studio 设计器改进部分

更改默认字体

.NET Core 3.0 上的 Windows 窗体引入了新的 Windows 窗体默认字体:“Segoe UI, 9pt”。 此字体更符合 Windows 用户体验 (UX) 指南。 但是,.NET Framework 使用“Microsoft Sans Serif, 8.25pt”作为默认字体。 这一变化使一些客户更难以将他们采用像素完美的布局的大型应用程序从 .NET Framework 迁移到 .NET。 更改整个应用程序的字体的唯一方法是编辑项目中的每个窗体,将 Font 属性设为其他字体。

现在,可以通过两种方式来设置默认字体:

  • 设置应用程序启动代码要使用的项目文件中的默认字体:

    重要

    这是首选方法。 通过使用项目来配置新应用程序启动系统,使 Visual Studio 可以在设计器中使用这些设置。

    在以下示例中,项目文件将 Windows 窗体配置为使用 .NET Framework 所用的相同字体。

    <Project Sdk="Microsoft.NET.Sdk">
    
      <!-- other settings -->
    
      <PropertyGroup>
        <ApplicationDefaultFont>Microsoft Sans Serif, 8.25pt</ApplicationDefaultFont>
      </PropertyGroup>
    
    </Project>
    

- 或 -

  • 以旧方式调用 Application.SetDefaultFont API(但没有设计器支持):

    class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.SetDefaultFont(new Font(new FontFamily("Microsoft Sans Serif"), 8.25f));
            Application.Run(new Form1());
        }
    }
    

Visual Studio 设计器改进

Windows 窗体可视化设计器现在可以准确地反映默认字体。 适用于 .NET 的 Windows 窗体的早期版本没有在可视化设计器中正确显示 Segoe UI 字体,实际上使用的是 .NET Framework 的默认字体来设计窗体。 由于新的新应用程序启动功能,可视化设计器可准确地反映默认字体。 此外,可视化设计器还遵循在项目文件中设置的默认字体。

Windows 窗体设计器在 Visual Studio 中使用默认字体设置

更多的运行时设计器

.NET 6 中添加了存在于 .NET Framework 中并且支持生成通用设计器(例如生成报表设计器)的设计器:

针对 PerMonitorV2 的高 DPI 改进

改进了 PerMonitorV2 的高 DPI 呈现:

  • 控件是使用与应用程序相同的 DPI 感知创建的。

  • 容器控件和 MDI 子窗口改进了缩放行为。

    例如,在 .NET 5 中,将 Windows 窗体应用从缩放比例为 200% 的监视器移动到缩放比例为 100% 的监视器会导致控件错位。 .NET 6 中已大幅改进了这一点:

    适用于 Windows 窗体的 .NET 6 中的高 DPI 改进

新 API

新 Visual Basic API

已更新的 API

改进的辅助功能

Microsoft UI 自动化模式可更好地与无障碍工具协同工作,例如讲述人和 Jaws。

另请参阅