Winform 支持高DPI的几种方式

Winform 支持高DPI的几种方式

前言

就基于目前的电脑而言,开发Winform界面真的是一键很头疼的事,由于现在基本上都是高DPI,渲染出来的控件就会根据DPI进行缩放,最后导致页面布局混乱。

虽然在.Net Core Winform上,已经可以直接通过设置 Application.SetHighDpiMode 来解决,但是在.Net Framework下,还是得通过其他方式。

以下方式可以按照官方文档描述选择性的采用或者全部使用。







开发环境: .NET Framework版本:4.8

开发工具: Visual Studio 2022










实现步骤

  1. 第一种方式就是添加程序清单文件,官方文档上也有介绍过此方法,右键项目->添加->新建项->应用程序清单文件(app.manifest)。


  1. 然后就可以看到文件中已经写好了注释,其中有这样一句话

指示该应用程序可感知 DPI 且 Windows 在 DPI 较高时将不会对其进行自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI,无需选择加入。选择加入此设置的 Windows 窗体应用程序(面向 .NET Framework 4.6)还应在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"


  1. 然后参考官网高DPI支持:

    learn.microsoft.com/zh- ,可以将Win10的相关属性也去掉,其他根据需求自行抉择

  2. 所以,最终 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"。