创建 DPI 感知应用程序

2023-12-27

我有一个 C# 表单应用程序。当我更改显示器的 DPI 时,所有控件都会移动。 我用了代码this.AutoScaleMode = AutoScaleMode.Dpi,但这并没有回避问题。

有人有想法吗?


编辑:从 .NET 4.7 开始,Windows 窗体改进了对高 DPI 的支持。请访问 learn.microsoft.com 了解更多相关信息 https://learn.microsoft.com/en-us/dotnet/framework/winforms/high-dpi-support-in-windows-forms但它仅适用于 Win 10 Creators Update 及更高版本,因此根据您的用户群,使用它可能还不可行。


困难,但并非不可能。当然,最好的选择是迁移到 WPF,但这可能不可行。

我花了很多时间来解决这个问题。以下是一些规则/指南,可使其在没有 FlowLayoutPanel 或 TableLayoutPanel 的情况下正常工作:

  • 始终以默认 96 DPI (100%) 编辑/设计您的应用程序。如果您以 120DPI (125% f.ex) 进行设计,当您稍后返回到 96 DPI 进行工作时,情况会变得非常糟糕。
  • 我已经成功使用 AutoScaleMode.Font ,但我还没有尝试过 AutoScaleMode.DPI 。
  • 确保在所有容器(表单、面板、选项卡页、用户控件等)上使用默认字体大小。 8,25 像素。最好不要在 .Designer.cs 文件中为所有容器设置它,以便它使用容器类中的默认字体。
  • 所有集装箱must使用相同的自动缩放模式
  • 确保所有容器在 Designer.cs 文件中设置以下行:

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); // for design in 96 DPI

  • 如果您需要在标签/文本框等上设置不同的字体大小,请为每个控件设置它们,而不是在容器类上设置字体,因为 winforms 使用容器字体设置来缩放其内容并让 f.ex 具有不同字体大小的面板比它包含的形式肯定会产生问题。如果表单和表单上的所有容器使用相同的字体大小,它可能会起作用,但我还没有尝试过。
  • 使用另一台计算机或具有更高 DPI 设置的虚拟 Windows 安装(VMware、Virtual PC、VirtualBox)来立即测试您的设计。只需从 DEV 计算机上的 /bin/Debug 文件夹运行已编译的 .exe 文件即可。

我保证,如果您遵循这些准则,即使您使用特定锚点放置了控件并且不使用流程面板,您也会没事。我们以这种方式构建的应用程序部署在数百台具有不同 DPI 设置的计算机上,我们不再有任何抱怨。所有表单/容器/网格/按钮/文本字段等大小都与字体一样正确缩放。图像也可以,但在高 DPI 下它们往往会有点像素化。

编辑:此链接有很多有用的信息,特别是如果您选择使用 AutoScaleMode.DPI:链接到相关的 stackoverflow 问题 https://stackoverflow.com/questions/185804/how-to-control-the-font-dpi-in-net-winforms-app

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建 DPI 感知应用程序 的相关文章

随机推荐

  • 如何将 javascript 中的数字数组转换为字符串?

    就像我有var arr 1 2 3 4 5 我希望这成为arr 1 2 3 4 5 我尝试使用 var x arr 0 toString outputs 1 但当我这样做时typeof x它输出 数字 当我这样做时我该如何转换它typeof
  • 如何从文本文件中删除非 UTF-8 字符

    我有一堆以 utf 8 编码的阿拉伯语 英语 俄语文件 尝试使用 Perl 脚本处理这些文件时 出现以下错误 Malformed UTF 8 character fatal 手动检查这些文件的内容 我发现其中有一些奇怪的字符 现在我正在寻找
  • java.lang.IllegalArgumentException:名称

    它在 Eclipse 中工作正常 但是当我创建 jar 并运行它时会给我这个异常 这是我正在使用的非 Web Spring Boot 应用程序 我应该作为独立 jar 运行 java lang IllegalArgumentExceptio
  • 如何在结束循环之前查看生成器的打印输出?

    我正在尝试在处理大量数据的生成器内打印调试信息 但是 只有当生成器完成时我才能看到结果 我使用的是python 3 我的代码如下 def generator while 1 print end time sleep 1 yield 1 fo
  • 使用 Jenkins 进行发布管理有哪些选项

    我正在评估 Jenkins 和 Apache Continuum 等构建引擎 我们的大部分构建都使用 Maven Jenkins 有哪些用于发布管理的选项 我所说的发布管理是指从源代码控制中的分支创建发布 然后更新 Maven 中的版本标签
  • 使用 GWT CellTableBuilder 按需构建自定义行

    GWT 2 5 RC 中引入了 CellTableBuilder API 但尚未提供全面的文档 是否有使用 CellTableBuilder 实现按需自定义行构建的教程 示例 到目前为止我发现的唯一例子就是这个http showcase2
  • 在大文件中进行搜索的最佳方法是什么?

    我希望对大文件 gt 4GB 应用 KMP 或类似 搜索 我预计这会给我带来问题 我无法将其全部复制到内存中 因为那里没有足够的空间 我的问题是 进行此搜索的最佳方法是什么 我是否应该简单地创建一个 FILE 并直接在文件中进行搜索 是否应
  • 如何组合数据然后分离连接的数据?

    我想将一系列数据合并到一个单单元格 G5 中 然后我想将Value G5拆分为原始形式 太感谢了 https docs google com spreadsheets d 1sVrpPvtQPG0Zw2Ar UxPHXNN0atEdQNX
  • PHP 中有从数组中提取“列”的函数吗?

    我有一个数组的数组 具有以下结构 array array page gt page1 name gt pagename1 array page gt page2 name gt pagename2 array page gt page3 n
  • Cobertura 如何与 JUnit 配合使用?

    我不明白Cobertura如何与JUnit合作 据我了解 cobertura 修改编译的字节代码并在该字节代码中插入它自己的命令 好的 之后 我们运行 Junit 框架并对其进行测试 谁能解释一下 cobertura 在什么时候获取执行了哪
  • 是否有一个 Python 习惯用法可以通过短路来评估函数/表达式列表?

    我写了一个简单的脚本来解决 逻辑谜题 这是学校里的谜题类型 你会被赋予许多规则 然后必须能够找到诸如 有五个音乐家 名字分别为 A B C 之类的问题的解决方案 D E 在一场音乐会上演奏 每人一个接一个地演奏 如果 A 在 B 之前演奏
  • 如何从键而不是值推断类型参数?

    我有一个表示有向图结构的类 它是具有一个类型参数的通用类K extends string对于节点名称 图表是通过传递一个对象来构造的 例如 a b b 在这个最小的例子中代表两个节点a and b 有一条边a b class Digraph
  • 为什么 ScriptEngine 不再有 Execute 方法?

    目前我已经开始更认真地与罗斯林合作 我发现本文 http visualstudiomagazine com articles 2011 11 16 the roslyn scripting api aspx关于使用ScriptEngine在
  • 通过四维数据寻路

    问题是找到飞机穿过四维风 不同高度的风 并且随着飞行而变化的风 预测风模型 的最佳路线 我使用了传统的 A 搜索算法 并对其进行了修改 使其能够在 3 维和风向量中工作 它在很多情况下都有效 但速度非常慢 我正在处理大量数据节点 并且不适用
  • PATH_MAX和NAME_MAX之间是什么关系,如何获取?

    In limits h 并且在 POSIX 联机帮助页的各个地方都引用了PATH MAX and NAME MAX 这些相互之间有何关系 他们的官方文档在哪里 如何在 C Python 和 GNU shell 环境的运行时和 相关 编译时获
  • 如何将身份验证、角色和安全性融入 DDD 中?

    如何在 C 域驱动设计项目中实现角色和安全性 关于它是否应该由调用应用程序 ASP NET MVC 实现还是在域模型本身 模型实体和服务 中实现 我们存在一些激烈的争论 有些人认为它应该在网站本身中 因为那里已经存在身份验证 但这意味着每次
  • 将屏幕截图上传到 iTunes Connect 时出现奇怪的错误

    我正在尝试将新的屏幕截图上传到 iTunes Connect 上的游戏页面 但当我这样做时 我收到了一个与现实和 或常识无关的错误 基本上 我上传了一堆具有正确分辨率 尺寸等的 iPhone 屏幕截图 然后收到一条错误消息 说我没有这样做
  • 如何在 igraph R 中的图组件之间添加边

    我有一个图表包含4 components 现在 我想在其中添加一个优势all components基于size of the membership 例如 下图包含4 components 首先 我将连接all components with
  • AngularJS - 原始/肮脏和触摸/未触摸之间的区别

    AngularJS 开发人员指南 表单 https docs angularjs org guide forms列出了许多有关表单和字段的样式和指令 对于每一个 都有一个 CSS 类 ng valid ng invalid ng prist
  • 创建 DPI 感知应用程序

    我有一个 C 表单应用程序 当我更改显示器的 DPI 时 所有控件都会移动 我用了代码this AutoScaleMode AutoScaleMode Dpi 但这并没有回避问题 有人有想法吗 编辑 从 NET 4 7 开始 Windows