为什么.NET WinForms在高DPI设置下缩放不正确?

7

我的.NET应用程序(如果你真的想知道,是VB.NET 3.5)在高DPI设置下渲染时无法正确格式化。到目前为止,我找到的所有解决方法都只是简单地解释了问题的原因是“某些UI元素无法正确缩放”。我想知道是否有更有意义的解释?谢谢!

1个回答

11
基本上,问题在于GDI + (以及Windows Forms)使用设备像素作为其默认测量单位。当您更改DPI设置时,像素的物理大小实际上并不会改变(像素就是像素),但是以非像素大小测量的字体和图像会相应缩放。 Windows Forms尽最大努力适应这种情况,通过扩大布局空间来解决,但唯一真正的解决方案是始终使用非像素测量系统。这就是WPF所做的。
在WPF中,96 DPI下,设备独立像素对应于与物理像素相同的大小。但是当您更改系统的DPI时,WPF全局缩放虚拟坐标系。应用程序、控件等都不知道它们不再与物理像素对齐。实际上,这有时会在WPF中引起混叠问题,但您几乎永远不必担心应用程序在不同DPI设置下的布局不同。
在Windows Forms中,您可以采取的一种方法是使用“新”(自.NET 2.0以来)的布局面板,例如TableLayoutPanel、FlowLayoutPanel等。尽可能使用Anchor、Dock和AutoSize。这将使Windows Forms尽可能地重新排列您的用户界面。
此外,请注意,如果您在非标准DPI创建表单,则Windows Forms将其用作“基本”大小。它几乎总是会出现问题。因此,请尝试使用96 DPI来设计您的表单。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接