默认情况下,大多数 Windows 窗体应用程序不支持 DPI。事实上,大多数 Windows 应用程序不支持 DPI。因此,您需要在应用程序清单中选择启用 DPI 感知功能:
<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>
由于 DPI 感知是每个进程的,因此 VS 设计者在此问题上别无选择 - 它在可感知 DPI 的 Visual Studio 中运行。
不过,请确保在低 DPI 和高 DPI 下一切正常。 DPI 感知意味着“我将正确处理所有 DPI 缩放,无需为我伪造它;谢谢。”希望您设计的表单具有适当的自动缩放和布局,或者使用与设备无关的单位而不是像素:)
当您的应用程序未声明可识别 DPI 时,Windows 会假定您是未正确处理 DPI 的旧版应用程序。因此,为了防止出现问题,它假装您实际上正在渲染到更小的显示器 - 在您的情况下,是一半大小,然后将生成的表面放大回适当的大小。这会导致模糊,尤其是文本,但可以确保所有内容都具有适当的大小和比例 - 例如您不会得到比其中的文本更小的按钮或重叠的控件。
如果您使用正确的布局方法,Windows 窗体和 WPF 都对正确处理 DPI 提供了很好的支持,因此 .NET 绝对可以识别 DPI。但两者也完全能够不感知 DPI,并且大多数应用程序仍然忽略 DPI 问题,因此默认值与任何其他 Windows 应用程序相同。由于没有“旧版 WPF”应用程序,并且执行 WPF 的最简单方法也是 DPI 感知,因此 WPF 的默认项目模板已经包含一个声明 DPI 感知的清单,所以我假设您在 Windows 窗体中创建了您的项目 :) 事实上,考虑到现在 Windows 的发展方式,您可能无论如何都希望拥有一个程序集清单,以正确管理所有兼容性功能:)
为了获得额外的奖励,当您拥有多个具有不同 DPI 的显示器时会出现更多问题 - 要声明对此的适当支持,您可以使用 <dpiAware>true/PM</dpiAware>。这仅在 Windows 8.1+ 上可用,并且正确实施可能非常棘手。