c# AutoScaleMode设置为DPI,控件布局错位的问题

前言:之前的winForm布局,总是不能做到所见即所得,很烦。将winForm的autoscalemode 属性设置为dpi。可以做到不同的PC设备具备同样的布局观感。

autoscalemode 可以设置为dpi, font, none 三种。是选font好,还是dpi好,还是none好?建议优先选择 Dpi ,其次是 Font,不推荐 None

Dpi: 按屏幕 DPI(每英寸像素数)缩放界面,适配高 DPI 显示器(如 4K 屏、笔记本高分屏),跨不同 DPI 设备运行(如工业平板 + 台式机)
Font: 按系统默认字体大小缩放界面,适配不同字体设置(如用户放大系统字体),固定 DPI,但需要适配不同字体大小的场景​​​​​​​
**None:**不自动缩放,界面尺寸固定(像素级固定),仅在单一固定设备上运行(如专用工业控制器)

优先选「Dpi」模式(推荐)
  • 工业场景中越来越多设备是高 DPI 屏(如 4K 工控屏),Dpi模式能避免界面模糊、控件错位(比如你新增的CheckedListBox、日志文本框不会因 DPI 缩放而重叠)

  • 你的界面有固定尺寸的控件(如按钮Size = (108,104)),Dpi模式会按比例缩放控件大小和间距,保持布局一致性;

  • .NET Framework 4.6 及以上对Dpi模式支持完善(工业项目常用.NET Framework 4.5+,完全兼容)。

注意事项:

项目属性中开启「DPI 感知」(关键!否则Dpi模式无效):

右键项目 → 属性 → 应用程序 → 点击「清单」按钮 → 在清单文件中添加:

XML 复制代码
<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/PM</dpiAware>
  </windowsSettings>
</application>

避免使用绝对像素坐标布局(如Control.Location = new Point(10,20)),尽量用「锚点(Anchor)」或「停靠(Dock)」布局(比如txtRpdoLog设置Dock = Bottom,自动适配窗口大小)。

如果您的visual studio 软件没有生成清单按钮,那么可以用另外的方法:

手动添加清单文件,再关联到项目中。步骤很简单,按以下操作来:

第一步:手动添加「应用程序清单文件」到项目

  1. 右键点击你的项目名称(比如:WannaIMU)→ 选择「添加」→ 「新建项」(或直接按 Ctrl+Shift+A);

  2. 在「添加新项」窗口中,左侧选择「Visual C# 项」→ 「Windows 桌面」;

  3. 右侧找到「应用程序清单文件」(图标是 XML 文件样式,名称默认是 app.manifest);

  4. 确保「名称」保持 app.manifest(无需修改),点击右下角「添加」按钮;

  5. 添加后,解决方案资源管理器中会出现 app.manifest 文件(和 Form1.cs 同级)

第二步:将自定义清单关联到项目(让它生效)

  1. 右键点击项目 → 「属性」→ 「应用程序」选项卡;
  2. 往下滚动到「资源」区域,找到「清单」下拉框;
  3. 点击下拉框,选择「浏览」→ 找到项目根目录下刚添加的 app.manifest → 选中后点击「打开」;
  4. 此时「清单」下拉框会显示 app.manifest(或「嵌入的资源(app.manifest)」),说明关联成功;

第三步:修改清单中的 DPI 配置(和之前一致)

  1. 双击 app.manifest 打开文件;
  2. 找到 <application> 节点(默认内容如下,可能被注释,需解除注释或替换):
XML 复制代码
<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <!-- 开启Per-Monitor DPI感知v2(兼容Win10/11工业设备) -->
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">PerMonitorV2,PerMonitor</dpiAware>
    <!-- 禁用系统自动拉伸,避免双重缩放 -->
    <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
  </windowsSettings>
</application>

这样就完成了自定义清单的添加和 DPI 配置。

相关推荐
梅梅9661 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
归零鸟9 天前
笔记本内屏黑屏,系统却说 “显示器一切正常“:一次 Intel PSR2 导致的 eDP 排查实录
计算机外设·电脑
Htr_9 天前
Cortex 使用指南:开源 API 知识层
前端·数据库·人工智能·重构·计算机外设
Htr_10 天前
Loqua 使用指南:让思维不再因键盘而减速
计算机外设
legendary_16313 天前
PD‑SINK芯片在无协议后端负载中的工程应用
c语言·开发语言·人工智能·智能手机·计算机外设
whysoft13 天前
创意新用法-把老磁带转录成mp3-第2部分
linux·计算机外设
yyt36304584115 天前
一次鼠标交互触发两次 Vue flushJobs:把高频交互从 VDOM 里拆出来
前端·vue.js·计算机外设
励志不掉头发的内向程序员16 天前
【LibreCAD 2D架构】从鼠标点击到图形创建:RS_ActionDrawLine交互流程与状态机解析
开发语言·c++·qt·学习·系统架构·计算机外设·交互
白日做梦Q16 天前
Intel核显笔记本屏幕闪烁、忽明忽暗解决:关闭显示器节能
计算机外设
陈年菠萝包17 天前
计算机组成原理(1计算机基本组成)
计算机外设