默认情况下,大多数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设计师对这个问题上没有选择 - 它的Visual Studio,这是内运行DPI知道。
尽管如此,确保所有的一切都适用于低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+,并且正确实施可能非常棘手。