本文主要解決兩個問題
- C# Winform高DPI字型模糊.
- 高DPI下(縮放>100%), UI設計器一直提示縮放到100%, 如果不重啟到100%,設計的控制元件會亂飛.
建立測試程式
- 新建.Net Windows窗體應用 (Winform)工程
- 選擇.Net6.0
- 將窗體尺寸定為 1000 x 1000 , 用於後面檢測縮放是否正確
- 新增一個按鈕 , 尺寸定為 150 x 50
- 新增一個圖片框 , 尺寸定為 300 x 300 , 右鍵匯入一張圖片
- 新增測試程式碼
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
}
}
}
- 執行看看效果: net6下執行,尺寸都是對的
正式開始
- 右鍵工程,新增應用程式清單
app.manifest
, 檔名用預設,修改
取消這段的註釋,開啟感知 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>
- 雙擊工程名稱, 編輯配置檔案,
TargetFrameworks
改為雙目標框架 <TargetFrameworks>net6.0-windows;net461;</TargetFrameworks>
, 儲存後提示過載工程 , 最好是關閉vs再開啟一次.
完整檔案如下
<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>
- 如果提示找不到控制元件, 在 Form1.Designer.cs 和 Form1.cs 新增
using System;
using System.Windows.Forms;
-
Program.cs
註釋掉ApplicationConfiguration.Initialize();
-
執行選擇
net461
備註:我的螢幕是 2800 x 1800 ,縮放 175%
果然, 顯示尺寸不對
- Form1.cs 新增 'AutoScaleMode = AutoScaleMode.Dpi;'
public Form1()
{
AutoScaleMode = AutoScaleMode.Dpi; //新增這句,要在'InitializeComponent();'上方
InitializeComponent();
}
再次執行
完美!
- 雙擊編輯窗體,沒有提示100%縮放, 新增標準選單和DataGridView測試
完美!雙倍的快樂!
總結
- 新建.Net Windows窗體應用 (Winform)工程 [.Net6.0]
- 新增應用程式清單
app.manifest
, 開啟感知 DPI TargetFrameworks
改為雙目標框架<TargetFrameworks>net6.0-windows;net461;</TargetFrameworks>
Program.cs
註釋掉ApplicationConfiguration.Initialize();
AutoScaleMode = AutoScaleMode.Dpi;
//新增這句,要在'InitializeComponent();'上方
老工程也可以通過編輯projet檔案升級到這種新工程格式,支援本文說的功能, 需要繼續出教程的請在評論區留言, 這幾天都在度假中, 今天就寫到這裡了. 下回見!
配套DEMO
https://github.com/densen2014/WinformHighDPICompatibleProgram