csharp winform 在高 DPI 缩放下界面错位

问题描述

当系统缩放比例大于 100% 时,WinForm 界面会出现错位。并且打开 VS 后,窗体设计器里面的窗口界面也是错位的。

界面出现错位

解决方案

处理窗体设计器错位

按照微软文档的方法,修改项目配置文件

1
2
3
4
5
6
7
8
9
10
11
12
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<!-- 新增以下两行 -->
<ApplicationHighDpiMode>SystemAware</ApplicationHighDpiMode>
<ForceDesignerDpiUnaware>true</ForceDesignerDpiUnaware>
</PropertyGroup>
</Project>

然后重启 vs,重新打开窗体设计器,界面就不会错位了。

处理 DPI 问题

Program.cs 文件中,添加Application.SetHighDpiMode(HighDpiMode.DpiUnawareGdiScaled);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.

// 添加这句代码,表示取消窗口对系统 DPI 的感知,直接缩放界面。
// DpiUnawareGdiScaled 在缩放下,能有更清晰的界面表现,不会糊。
Application.SetHighDpiMode(HighDpiMode.DpiUnawareGdiScaled);
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}

可以看到界面不再错位了。

界面不再错位

如果将枚举 HighDpiMode 改成 DpiUnaware,界面会有点糊。

界面有点糊

这一步是根据网上教程,创建 app.manifest 文件,并取消 dpi 部分注释后,VS 输出界面提示警告,要使用 Application.SetHighDpiMode API 来设置 DPI 缩放。

搜索后发现微软文档中有相关说明。

这里 有 HighDpiMode 枚举值的说明。


csharp winform 在高 DPI 缩放下界面错位
https://taylorandtony.github.io/2025/10/16/csharp-winform-在高-DPI-缩放下界面错位/
作者
TaylorAndTony
发布于
2025年10月16日
许可协议