WinForms无法正确缩放DPI的问题

9
我遇到了一个问题,无法在高 DPI 设置下正确显示 WinForms 应用程序。我查看了各种网站,发现 WinForms 都有正确的 AutoScaleMode。我尝试将其设置为 DPI 和 Font 两种模式,但是在使用高 DPI 设置(例如 125%)时,窗体始终在底部被截断。
我添加了一些代码来检查,如果我将 AutoScaleMode 设置为 DPI,则在窗体加载时,我会看到 AutoScaleDimensions 为 120,120,CurrentAutoScaleDimensions 也是 120,120。在 Form.designer.cs 文件中,有一行代码将 AutoScaleDimension 设置为 96,96。
如果我将 AutoScaleMode 设置为 Font,则可以在设计器中看到 AutoScaleDimensions 正确地设置为 new System.Drawing.SizeF(6F, 13F),但是当窗体加载时,AutoScaleDimensions 和 CurrentAutoScaleDimensions 都被设置为 8F,16F。
这个应用程序混合了一些WPF和WinForms,而且WPF屏幕首先出现。所以根据.Net 3.5中混合WinForms和WPF应用程序中的DPI缩放,我尝试设置应用程序和首先显示的WPF屏幕的TextFormattingMode为“Display”,但没有任何区别。
坦率地说,我对导致这个问题感到困惑。我想我可以添加代码来在运行时检测DPI并以编程方式调整大小,但我不应该这样做。AutoScaleMode(及相关)属性应该使这相当自动化。那么还应该检查什么可能会导致这个问题?

125%不是“高DPI”。WPF肯定会产生影响,因为它在运行时设置了高DPI感知标志,即使在清单中没有设置。WinForms可能会对是否应该进行缩放或让操作系统自动进行缩放感到困惑。 - Ben Voigt
Ben,抱歉,我想“更高的DPI”可能更准确。我需要更详细地研究这个问题,因为即使我改变了应用程序,使我们不首先显示WPF屏幕,问题仍然存在。 - WarnerYoung
现代的基于设置的方式使得整个高低字体的概念变得混乱。对于较大的字体,“每英寸点数”(Dots Per Inch)值较低。旧版的DPI设置中,较高的字体使用较低的数字,而新版本的Windows则假定标准DPI并使用字体大小百分比,因此较高的数字用于较高的字体。通常使用实际数字而不是高/低更不容易混淆。 - Denise Skidmore
这个问题解决了吗?我遇到了非常相似的情况,即使按照下面指定的方式向应用程序清单中添加了<dpiAware>代码,问题仍然存在。 - Anya Hope
不,至少我从未能够解决它,我不得不转向其他事情。在我的情况下,我认为这是因为我混合使用了WinForms和WPF的东西。最终,如果我能够清理干净,我会再次查看。很抱歉我没有更好的答案。 - WarnerYoung
这个解决方案对我有用。在AssemblyInfo.cs中添加“[assembly: DisableDpiAwareness]”。 - Maged Ragheb
2个回答

11

我几天前也遇到了类似的问题。经过几个小时的研究,我终于找到了一个非常简单的解决方案——在应用程序清单中添加<dpiAware>。下面是来自Microsoft网站的一个示例。

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" >
  <asmv3:application>
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
      <dpiAware>True</dpiAware>
    </asmv3:windowsSettings>
  </asmv3:application>
</assembly>

对于我的情况,我需要将<dpiAware>设置为“Per-monitor”以使其正常工作。也就是说,将中间的行更改为<dpiAware>Per-monitor</dpiAware>

每个值之间的区别如下所示(这些来自MSDN):

  • False -- 将应用程序设置为非DPI感知。
  • True -- 将应用程序设置为系统DPI感知。
  • Per-monitor -- 在Windows 8.1上,将应用程序设置为每个监视器-DPI感知。在Windows Vista到Windows 8上,将应用程序设置为非DPI感知。
  • True / PM -- 在Windows 8.1上,将应用程序设置为每个监视器-DPI感知。在Windows Vista到Windows 8上,将应用程序设置为系统DPI感知。

0

在显示器尺寸和更高的DPI设置下,屏幕是否已经不再足够大以显示整个表单?我这么说是因为我正在开发一个1024 x 768的winforms应用程序,并尝试调整用户DPI设置。如果我将DPI设置为150%,则无法在我的显示器上看到表单的底部部分,但应用程序会正确缩放。


很好的观点,Jeff,但不是这里正在发生的事情。表格仍然足够小,可以适合屏幕大小,只是尺寸不正确。 - WarnerYoung

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