从.NET Framework迁移到.NET Core,如何设置EnableWindowsFormsHighDpiAutoResizing为false?
在.NET Core/.NET 5+ WinForms中设置EnableWindowsFormsHighDpiAutoResizing
你遇到的这个问题很常见——.NET Core重构了WinForms的配置系统,原来.NET Framework里依赖app.config的高DPI设置方式确实不再直接生效了。别担心,有两种可靠的方式来实现你要的效果:
方法1:通过项目文件(.csproj)配置(推荐)
这是最简洁且持久的方式,修改项目文件后编译会自动生效,不需要额外的代码或配置文件:
打开你的WinForms项目的.csproj文件,在<PropertyGroup>节点内添加以下两个配置项:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net6.0-windows</TargetFramework> <!-- 你的目标框架,比如netcoreapp3.1也可以 --> <UseWindowsForms>true</UseWindowsForms> <!-- 设置DPI感知模式为PerMonitorV2 --> <DpiAwareness>PerMonitorV2</DpiAwareness> <!-- 禁用WinForms自动高DPI缩放,对应原来的EnableWindowsFormsHighDpiAutoResizing=false --> <EnableWindowsFormsHighDpiAutoResizing>false</EnableWindowsFormsHighDpiAutoResizing> </PropertyGroup> </Project>
保存文件后重新编译你的项目,这个配置会被嵌入到应用程序的元数据中,运行时WinForms会自动读取并应用,完全替代了原来app.config里的配置项。
方法2:通过代码层面配置
如果你需要动态控制这些设置(比如根据运行环境调整),可以在应用启动时通过代码配置:
.NET 6+ 顶级语句格式的Program.cs
using System.Windows.Forms; var builder = Application.CreateBuilder(args); // 配置DPI感知模式和自动缩放开关 builder.Properties["DpiAwareness"] = HighDpiMode.PerMonitorV2; builder.Properties["EnableWindowsFormsHighDpiAutoResizing"] = false; builder.UseWindowsForms(); var app = builder.Build(); // 启动主窗体 app.Run(new MainForm());
传统Main方法格式(.NET Core 3.1/.NET 5)
using System; using System.Windows.Forms; namespace YourWinFormsApp { static class Program { [STAThread] static void Main() { // 先设置DPI模式 Application.SetHighDpiMode(HighDpiMode.PerMonitorV2); // 通过应用配置禁用自动缩放 var config = new System.Configuration.Configuration(); config.AppSettings.Settings.Add("EnableWindowsFormsHighDpiAutoResizing", "false"); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } } }
为什么原来的app.config不生效?
在.NET Core/.NET 5+中,WinForms团队重构了配置加载逻辑,不再读取app.config里的<System.Windows.Forms.ApplicationConfigurationSection>节点,而是改用MSBuild项目属性(方法1)或新的应用构建器系统(方法2)来管理这些全局设置,这样更符合.NET Core的配置统一规范。
用上面的任意一种方法,都能实现和你原来.NET Framework环境中完全一致的高DPI行为——启用PerMonitorV2感知,同时禁用自动缩放,让你可以自行处理窗口的缩放逻辑。
内容的提问来源于stack exchange,提问作者Zj Wine
相关产品推荐
相关产品推荐

