c# - 创建 DPI 感知应用程序

标签 c# winforms dpi dpi-aware

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

有没有人有想法?

最佳答案

编辑:从 .NET 4.7 开始,Windows 窗体改进了对高 DPI 的支持。 Read more about it on learn.microsoft.com它仅适用于 Win 10 Creators Update 及更高版本,因此根据您的用户群,使用它可能不可行。


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

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

  • 始终以默认的 96 DPI (100%) 编辑/设计您的应用。如果您在 120DPI(125% f.ex)下进行设计,那么当您稍后回到 96 DPI 进行工作时,它会变得非常糟糕。
  • 我成功地使用了 AutoScaleMode.Font,但我没怎么尝试过 AutoScaleMode.DPI。
  • 确保在所有容器(表单、面板、标签页、用户控件等)上使用默认字体大小。 8,25 像素。最好不要在所有容器的 .Designer.cs 文件中设置它,以便它使用容器类中的默认字体。
  • 所有容器必须使用相同的AutoScaleMode
  • 确保所有容器都在 Designer.cs 文件中设置了以下行:

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);//用于 96 DPI 的设计

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

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

编辑:此链接有很多有用的信息,特别是如果您选择使用 AutoScaleMode.DPI:link to related stackoverflow question

关于c# - 创建 DPI 感知应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4075802/

相关文章:

c# - 如何使用对象上下文在 Entity Framework 中使用批量插入?

c# - 是否有 Windows 7 文件夹位置控件或是否需要自定义代码?

c# - 如何在 C#.Net 中移动表单?

.net - Silverlight 对比WPF 对比Winforms 有什么特别适合我的目的?

python - PyQt5 中的 devicePixelRatio 损坏

winforms - 在 VS2017 Winforms 应用程序中存在 IDE 缩放问题

windows - 是否有一种简单的方法可以强制Windows使用固定的DPI值而不是当前DPI设置来计算文本范围?

c# - 如何在多边形内旋转位图?

c# - 自定义窗口模仿 SceneView

c# - 检测自定义 wpf 文本框上的绑定(bind)错误