在C#.NET Windows窗体应用程序中,EnableWindowsFormsHighDpiAutoResizing设置是用来做什么的?

9

我希望用C# .NET和常规的windows表单(而不是WPF)制作一个支持每个监视器DPI的应用程序。

我了解选择进入每个监视器DPI支持的概念,并已在清单中完成了此操作:

<!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
   DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need 
   to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should 
   also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. -->

<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware>
  </windowsSettings>
</application>

当我选择该选项时,我的应用程序在从一个96DPI的显示器(我的默认显示器)拖到一个144DPI的显示器上时,其像素大小根本不会改变(即应用程序在两个显示器上都是像素对像素相同的,除了最小化、最大化、关闭图形略有不同)。因此,在144DPI的显示器上,应用程序非常小,文本很难阅读。
似乎“EnableWindowsFormsHighDpiAutoResizing”设置没有效果,我的应用程序显示方式完全相同,无论这个设置是true还是false,除非我在app.config文件中做错了什么。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
    <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
  </appSettings>

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/>
  </startup>
</configuration>

有人能解释一下这个选项是做什么用的吗?

它是否是编写C# Windows窗体应用程序的解决方案的一部分,可以在从96DPI监视器拖动到144DPI监视器时自动调整大小? (自动意味着无需编写代码来迭代所有控件并设置自定义比例因子)。

我已经花了很多时间研究这个问题,但我自己还没有清楚的答案。

似乎如果我选择进入每个监视器的DPI感知,则< strong>必须自己处理< code> WM_DPICHANGED 才能执行某些操作。如果这是答案,那就是了,但我真的觉得自己错过了一些内置的方法。


3
它使得自.NET 4.5以来进行的修复DPI问题的bug能够生效,特别是NumericUpDown控件上下箭头在高DPI屏幕上过窄的问题。然而,在Win8.1使用单独的显示器DPI功能时需要重写WndProc()才能看到WM_DPICHANGED消息,并且重新缩放窗口完全由自己承担。在WPF中很容易做到,但在Winforms中则可以通过更改窗体的Font属性来实现。但并不总是顺利,最好在设计器中检查一下。 - Hans Passant
谢谢,汉斯。我的下一个问题是,我是否可以使用WPF目标xp<->Windows 10?也许现在是时候学习新技术了...如果我不需要支持Windows XP,我只会制作一个UWP应用程序。 - Wayne Uroda
最让我恼火的是,C#显然具有自动调整窗体大小的能力,因为如果选择主监视器作为高DPI监视器,则在程序启动时会自动调整。看起来他们可以轻松修复以正确支持每个监视器模式,但我猜他们正忙于UWP、WPF和其他众多技术... - Wayne Uroda
4
从.NET Framework 4.7和Windows 10创作者更新版开始,您可以通过在app.config文件中添加“DpiAwareness”键来为Windows Forms应用程序指定每个监视器的DPI感知。有关如何执行此操作的详细信息,请参见此MSDN页面。 - Knowledge Cube
2个回答

1
"dpiAware = true"表示应用程序应该处理DPI变化,否则Windows操作系统会为您缩放表单/字体。这是我的理解。

1
是的,你说得没错,但这不是我的问题。我特别问的是 EnableWindowsFormsHighDpiAutoResizing - Wayne Uroda

0
appSettings标签替换为System.Windows.Forms.ApplicationConfigurationSection,这是正确的配置部分
像这样:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
    </startup>

    <System.Windows.Forms.ApplicationConfigurationSection>
        <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
    </System.Windows.Forms.ApplicationConfigurationSection>
</configuration>

如果您要为CefSharp启用Hi DPI Support,请在Win10及以上版本中包含dpiAwareness标签。
<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
  </windowsSettings>
</application>

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