This paper mainly solves two problems
- C#Winform high DPI fonts are blurred.
- Under high DPI (zoom>100%), the UI designer keeps prompting to zoom to 100%. If you don't restart it to 100%, the designed controls will fly around.


Establish test procedures
- New. Net Windows Forms Application (Winform) Project

- Select. Net6.0

- Set the size of the form to 1000 x 1000 for later verification of correct scaling

- Add a button, size 150 x 50

- Add a picture box with the size set to 300 x 300 , and right-click to import a picture


- Add test code
namespace WinFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Text = this.Width + "x" + this.Height + " pic "+ pictureBox1.Width + "x" + pictureBox1.Height + 启动环境();
}
public static string 启动环境()
{
#if NET461
return (".NET Framework 4.6.1");
#elif NET6_0
return (".NET6");
#endif
}
}
}
- Run it and see the effect: run it under net6, the size is correct

officially began
- 右键工程,添加应用程序清单
app.manifest, 文件名用默认,修改

Uncomment this paragraph and turn on sensing DPI
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
- Double-click the project name to edit the configuration file
TargetFrameworks 改为双目标框架 <TargetFrameworks>net6.0-windows;net461;</TargetFrameworks> , 保存后提示重载工程 , 最好是关闭 vs 再打开一次.
The complete document is as follows
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFrameworks>net6.0-windows;net461;</TargetFrameworks>
<UseWindowsForms>true</UseWindowsForms>
<ApplicationManifest>app.manifest</ApplicationManifest>
<ApplicationVisualStyles>true</ApplicationVisualStyles>
<ApplicationUseCompatibleTextRendering>false</ApplicationUseCompatibleTextRendering>
<ApplicationHighDpiMode>SystemAware</ApplicationHighDpiMode>
</PropertyGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>
- If prompted that the control cannot be found, add it in Form1.Designer.cs and Form1.cs
using System;
using System.Windows.Forms;
Program.cs注释掉ApplicationConfiguration.Initialize();运行选择
net461
Note: My screen is 2800 x 1800 , zoom 175%

Sure enough, the display size is wrong

- Form1.cs Add 'AutoScaleMode = AutoScaleMode.Dpi;'
public Form1()
{
AutoScaleMode = AutoScaleMode.Dpi; //添加这句,要在'InitializeComponent();'上方
InitializeComponent();
}
run again

Perfect!
- Double-click the edit form, 100% zoom without prompting, add standard menus and DataGridView tests

** Perfect! Double the happiness!**
summary
- New. Net Windows Forms Application (Winform) Project [.Net6.0]
- 添加应用程序清单
app.manifest, 打开感知 DPI TargetFrameworks改为双目标框架<TargetFrameworks>net6.0-windows;net461;</TargetFrameworks>Program.cs注释掉ApplicationConfiguration.Initialize();AutoScaleMode = AutoScaleMode.Dpi;//添加这句,要在'InitializeComponent();'上方
** Old projects can also be upgraded to this new project format by editing projet files, which supports the functions described in this article. If you need to continue to issue tutorials, please leave a message in the comments area. You have been on vacation these days, so I'm done here today. See you next time!**
** Supporting DEMO**