解决 Visual Studio 中 Windows 窗体设计器的 HDPI/缩放问题

本文将介绍如何通过以非 DPI 感知进程的形式运行 Visual Studio,解决因 HDPI 监视器上 Windows 窗体设计器的限制而导致的呈现问题。 HDPI 代表较高的每英寸点数,每个点表示物理设备像素。

较高的像素密度能创建更清晰的图像,并正确显示缩放大小元素。 如果没有正确缩放,用户界面 (UI) 元素和文本就会因为太小而无法有效使用,也可能会重叠。 为了帮助解决此问题,Windows 会自动缩放 UI 百分比以匹配 DPI 设置。 例如,DPI 设置为 100% 表示 96 DPI,而 125% 表示 120 DPI。 监视器曾经每英寸提供 96 个像素,Windows 将其用作 100% 位图绘制的基线。 但随着显示技术的进步,监视器现在提供 300 DPI 或更高的面板。

当应用程序声明自身是 DPI 感知应用程序时,就表示其在更高的 DPI 设置下表现良好,因此 Windows 可以应用自动缩放。 相反,非 DPI 感知应用程序以每英寸 96 像素(或 100% 比例)的固定 DPI 值呈现内容,因此不会对其应用自动缩放。

Windows 窗体设计器是不感知 DPI 的

注意

在 Visual Studio 2022 版本 17.8 或更高版本中,可以避免本文中所述的问题。 Visual Studio 2022 版本 17.8 支持 DPI 感知应用程序中的非 DPI 感知选项卡。 请参阅 Visual Studio DPI 改进。 通过此操作,可以为非 DPI 感知上下文设计 Windows 窗体,而无需在非 DPI 感知模式下运行 Visual Studio。 要在 Windows 窗体项目中使用此设置,请将项目文件中的属性 ForceDesignerDPIUnaware 设置为 true

<PropertyGroup>
  ...
  <ForceDesignerDPIUnaware>true</ForceDesignerDPIUnaware>
</PropertyGroup>

默认情况下,Visual Studio 是一个每英寸点数 (DPI) 感知应用程序,因此其显示会自动缩放。 但是,Windows 窗体设计器是非 DPI 感知应用,因此它显示为 96 DPI 的位图。 如果没有自动缩放支持,在 HDPI 监视器上打开窗体时,会出现问题和重叠现象,如下图所示:

Screenshot of Windows Forms Designer on HDPI monitor that shows issues due to lack of autoscaling support.

在 HDPI 监视器上的 Windows 窗体设计器中打开窗体时,Visual Studio 会显示一个信息栏,其中显示监视器的当前缩放百分比(例如,150%/144 DPI)、以 100% 缩放比例重启 Visual Studio 以匹配 Windows 窗体设计器的选项,以及更多信息。 以 100% 缩放比例重启会导致 VS 不感知 DPI,从而可以正确呈现而不会出现重叠。

Screenshot of the information bar in Visual Studio to restart in DPI-unaware mode.

提示

  1. 如果已关闭该信息栏,但想要以不感知 DPI 的状态重启 Visual Studio,请使用 DevEnv.exe 工具
  2. 如果工作中不使用设计器,则可以忽略该信息栏。 还可以禁用通知,以便不继续显示该信息栏。

以非 DPI 感知进程的形式重启 Visual Studio

若解决这些 UI 问题,建议的解决方案是以非 DPI 感知进程的形式重启 Visual Studio,这就表示它以 100% 缩放比例 (96 DPI) 重启。

若要切换到 DPI-unaware:

  • 请选择在 Windows 窗体设计器中打开窗体时显示的黄色信息栏上的“使用 100% 缩放比例重新启动 Visual Studio”选项

在 Windows 窗体设计器中完成操作后,必须重启 Visual Studio 以将其恢复为其默认的 DPI 感知进程。

若要返回到 DPI 感知:

  • 关闭并重新打开 Visual Studio 以再次返回到 DPI 感知。 或者,可以在信息栏中选择“以 DPI 感知进程的形式重启 Visual Studio”选项

以非 DPI 感知进程的形式运行 Visual Studio 时,设计器布局问题会得到解决,但字体可能会变得模糊,并且 XAML 设计器等其他设计器中也可能会出现问题。 以非 DPI 感知进程的形式运行 Visual Studio 时,Visual Studio 将显示另一条信息性消息,指出“Visual Studio 正在以非 DPI 感知进程的形式运行。 WPF 和 XAML 设计器可能无法正确显示。”

注意

  • 在选择以非 DPI 感知进程的形式重启 Visual Studio 后,如果有未停靠的工具窗口,则这些工具窗口的位置可能会发生更改。
  • 如果使用默认的 Visual Basic 配置文件,或者在“工具”>“选项”>“项目和解决方案”中取消选择了“创建时保存新项目”选项,则 Visual Studio 以非 DPI 感知进程的形式重启时无法重新打开该项目 。 但是,可以通过在“文件”>“最近使用的项目和解决方案”下选择该项目将其打开 。

注意

  • 在选择以非 DPI 感知进程的形式重启 Visual Studio 后,如果取消停靠工具窗口,则这些工具窗口的位置可能会发生更改。
  • 以非 DPI 感知进程的形式重启 Visual Studio 时,默认的 Visual Basic 配置文件将无法重新打开项目。 而是通过“文件”>“最近使用的项目和解决方案”访问项目。

使用 Windows 将显示缩放比例设置为 100%

若要避免使用 Visual Studio 切换显示缩放比例,请在 Windows 设置中调整缩放比例。 例如,在 Windows 11 中,可以将缩放比例设置为 100% (96 DPI)。

为此,请在任务栏的搜索框中键入“显示设置”,然后选择“更改显示设置”。 在“设置”窗口中,将“更改文本、应用和其他项的大小”设置为“100%” 。 请注意,100% 缩放比例 (96 DPI) 可能会使用户界面太小而无法使用。

使用 DevEnv 命令行工具禁用缩放

若要使用命令行工具(而不是用户界面工具)管理显示设置,请使用 DevEnv.exedevenv.exe 命令将 /noscale 作为命令行参数,在 100% 缩放模式下运行。 以下是使用方法:

  1. 从 Visual Studio菜单栏中选择“工具”>“命令行”>“开发人员命令提示”。
  2. 然后输入 devenv /noScale

其他选项

除了上述选项外,还可以尝试以下选项:

疑难解答

如果 DPI 感知转换在 Visual Studio 中未按预期方式工作,请确保注册表编辑器中的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\devenv.exe 子项不存在 dpiAwareness 值。 如果存在该值,请将其删除。