我有一个 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(使用前将#替换为@)