Winform 支持高DPI的几种方式
前言
就基于目前的电脑而言,开发Winform界面真的是一键很头疼的事,由于现在基本上都是高DPI,渲染出来的控件就会根据DPI进行缩放,最后导致页面布局混乱。
虽然在.Net Core Winform上,已经可以直接通过设置
Application.SetHighDpiMode
来解决,但是在.Net Framework下,还是得通过其他方式。
以下方式可以按照官方文档描述选择性的采用或者全部使用。
开发环境: .NET Framework版本:4.8
开发工具: Visual Studio 2022
实现步骤
-
第一种方式就是添加程序清单文件,官方文档上也有介绍过此方法,右键项目->添加->新建项->应用程序清单文件(app.manifest)。
-
然后就可以看到文件中已经写好了注释,其中有这样一句话
指示该应用程序可感知 DPI 且 Windows 在 DPI 较高时将不会对其进行自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI,无需选择加入。选择加入此设置的 Windows 窗体应用程序(面向 .NET Framework 4.6)还应在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"
-
然后参考官网高DPI支持:
https:// learn.microsoft.com/zh- cn/dotnet/desktop/winforms/high-dpi-support-in-windows-forms?view=netframeworkdesktop-4.8 ,可以将Win10的相关属性也去掉,其他根据需求自行抉择
-
所以,最终
app.manifest
文件内容如下
<?xml version="1.0" encoding="utf-8"?><assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> <security> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> <!-- UAC 清单选项 如果想要更改 Windows 用户帐户控制级别,请使用 以下节点之一替换 requestedExecutionLevel 节点。
<requestedExecutionLevel level="asInvoker" uiAccess="false" /> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> <requestedExecutionLevel level="highestAvailable" uiAccess="false" />
指定 requestedExecutionLevel 元素将禁用文件和注册表虚拟化。 如果你的应用程序需要此虚拟化来实现向后兼容性,则移除此 元素。 --> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的 Windows 版本的列表。取消评论适当的元素, Windows 将自动选择最兼容的环境。-->
<!-- Windows Vista --> <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
<!-- Windows 7 --> <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
<!-- Windows 8 --> <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 --> <!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application> </compatibility>
<!-- 指示该应用程序可感知 DPI 且 Windows 在 DPI 较高时将不会对其进行 自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI,无需 选择加入。选择加入此设置的 Windows 窗体应用程序(面向 .NET Framework 4.6)还应 在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。