使用DPI使WinForms正确扩展的问题

时间:2014-06-16 21:53:22

标签: c# .net wpf winforms dpi

我遇到了在高DPI设置下正确显示WinForms应用程序的问题。我检查了各种网站,WinForms都有正确的AutoScaleMode。我已经尝试将它设置为DPI和Font。但是,当使用高DPI设置(例如125%)时,表格总是会在底部附近切断。

我添加了一些代码来检查,如果我将AutoScaleMode设置为DPI,当表单加载时,我看到表单加载时AutoScaleDimensions为120,120,而CurrentAutoScaleDimensions也为120,120。在Form.designer.cs文件中,有一行将AutoScaleDimension设置为96,96。

如果我将AutoScaleMode设置为Font,那么我可以在设计器中看到AutoScaleDimension已正确设置为新的System.Drawing.SizeF(6F,13F),但是当表单加载时,AutoScaleDimension和CurrentAutoScaleDimension都设置为8F,16F

这个应用程序混合了一些WPF和WinForms,WPF屏幕首先出现。所以基于DPI Scaling in .Net 3.5 in Mixed WinForms and WPF Application,我尝试为应用程序设置TextFormattingMode,并为首先显示的WPF屏幕设置“显示”,但它没有任何区别。

坦率地说,我不知道造成这种情况的原因。我想我可以通过在运行时检测DPI来添加代码来以编程方式调整大小,但我不应该这样做。 AutoScaleMode(和相关的)属性应该使这相当自动化。那么我还应该检查哪些可能导致这个问题呢?

2 个答案:

答案 0 :(得分:8)

几天前我遇到了类似的问题。经过几个小时的研究,我终于找到了一个非常简单的解决方案 - 将<dpiAware>添加到应用程序清单中。以下是Microsoft's website的示例。

<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感知。
  • 每个监视器 - 在Windows 8.1上,将应用程序设置为每个监视器-DPI识别。在Windows Vista到Windows 8中,将应用程序设置为不支持DPI。
  • True / PM - 在Windows 8.1上,将应用程序设置为每个监视器-DPI识别。在Windows Vista到Windows 8中,将应用程序设置为system-DPI aware。

答案 1 :(得分:0)

对于显示器尺寸和较高的DPI设置,屏幕是否可能不再大到足以显示整个表格?我这样说是因为我正在开发一个1024 x 768 winforms应用程序,并且正在使用用户DPI设置。如果我将DPI设置为150%,我无法再在显示器上看到表单的底部,但应用程序正在正确缩放。

相关问题