为什么.NET会在大DPI设置下不正确地缩放?

时间:2010-03-15 04:47:43

标签: .net winforms

我的.NET应用程序(如果你真的必须知道VB.NET 3.5)表单在高DPI设置下渲染时格式不正确。到目前为止,我发现的所有修复都只是解释了问题的原因,因为“某些UI元素无法正确扩展”。我想知道是否有人有更有意义的解释?谢谢!

1 个答案:

答案 0 :(得分:10)

基本上问题是GDI +(以及扩展名,Windows Forms)使用设备像素作为其默认测量单位。更改DPI设置时,像素的物理大小实际上不会更改(像素是像素),但是以非像素大小测量的字体和图像会相应缩放。 Windows Forms试图通过为布局腾出更多空间来尽可能地适应这种情况,但唯一真正的解决方案是始终使用基于非像素的测量系统。这就是WPF所做的。

在WPF中,在96 DPI时,与设备无关的像素对应于与物理像素相同的大小。但是当您更改系统的DPI时,WPF会全局缩放虚拟坐标系。应用程序,控件等都不知道它们不再与物理像素对齐。事实上,这有时会导致WPF中的别名问题,但您几乎不必担心应用程序的布局在不同的DPI设置中会有所不同。

最小化Windows窗体中的问题可以做的一件事是使用“新”(从.NET 2.0开始)布局面板,如TableLayoutPanel,FlowLayoutPanel等。尽可能使用Anchor,Dock和AutoSize。这将允许Windows窗体尽可能地重新流动您的UI。

另请注意,如果您使用非标准DPI创建表单,Windows窗体将使用此作为“基本”大小。它几乎总是搞砸了。因此,尝试使用96 DPI来设计表单。