C# 使用DPI正确缩放WinForms时遇到的问题

C# 使用DPI正确缩放WinForms时遇到的问题,c#,.net,wpf,winforms,dpi,C#,.net,Wpf,Winforms,Dpi,我遇到了让WinForms应用程序在高DPI设置下正确显示的问题。我检查了各种网站,WinForms都有正确的自动缩放模式。我已经尝试将其设置为DPI和字体。但是,当使用高DPI设置(例如125%)时,表格总是在底部附近被切断 我添加了一些代码来检查,如果我将AutoScaleMode设置为DPI,当表单加载时,我会看到AutoScaleDimensions在表单加载时为120120,CurrentAutoScaleDimensions也为120120。在Form.designer.cs文件中,

我遇到了让WinForms应用程序在高DPI设置下正确显示的问题。我检查了各种网站,WinForms都有正确的自动缩放模式。我已经尝试将其设置为DPI和字体。但是,当使用高DPI设置(例如125%)时,表格总是在底部附近被切断

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

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

此应用程序将一些WPF与WinForms混合,WPF屏幕首先出现。因此,基于此,我尝试将应用程序和首先显示的WPF屏幕的TextFormattingMode设置为“Display”,但没有任何区别


坦率地说,我不知道是什么导致了这一切。我想我可以添加代码,通过在运行时检测DPI以编程方式调整大小,但我不必这样做。AutoScaleMode(和相关)属性应该使这相当自动化。那么,我还应该检查哪些可能导致此问题的内容呢?

是否有可能由于显示器大小和更高的DPI设置,屏幕不再大到足以显示整个表单?我之所以这么说,是因为我正在开发一个1024x768WinForms应用程序,并使用用户DPI设置。如果我将DPI设置为150%,我将无法再在显示器上看到表单的底部,但应用程序的缩放正确。

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


真的
对于我的情况,我需要将
设置为每个监视器,以使其正常工作。也就是说,在每个监视器 以下列出了每个值之间的差异(这些差异来自MSDN):

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

125%不是“高DPI”。WPF肯定有影响,因为它在运行时设置了高DPI感知标志,即使它没有在清单中设置。WinForms可能会对它是应该进行缩放还是让操作系统自动进行缩放感到困惑。Ben,对不起,我认为“更高的DPI”可能更准确。我需要更详细地了解这一点,因为即使在我更改应用程序之后,问题仍然存在,因此我们不会首先显示WPF屏幕。基于%的现代设置使整个高/低设置变得混乱。较大字体的“每英寸点数”较低。旧式DPI设置较低的数字用于较高的字体,较新版本的Windows采用标准DPI并使用字体大小百分比,因此较高的值用于较高的字体。一般来说,使用实际数字比使用高/低数字更容易混淆。这个问题解决了吗?我正在经历类似的事情,即使在将代码添加到下面指定的应用程序清单之后,这种情况仍然存在。不,至少我无法修复它,我不得不继续做其他事情。在我的例子中,我认为这是因为我混合了WinForms和WPF。最后,如果我能把它清理干净,我会再看一眼。对不起,我没有更好的答案。说得好,杰夫,但不,这里不是这样的。表单仍然足够小,可以放在屏幕上,只是大小不正确。
<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>