vs 2022 設計 winform 高dpi兼容程式

vs 2022 設計 winform 高dpi兼容程式

高dpi下(縮放>100%), ui設計器一直提示縮放到100%, 如果不重啟到100%,設計的控制項會亂飛.

最后更新 2022/5/14 下午12:02
AlexChow
预计阅读 3 分钟
分类
Winform
标签
.NET Winform ui設計 Visual Studio

本文主要解決兩個問題

  • c# winform 高 dpi 字體模糊.
  • 高 dpi 下(縮放>100%), ui 設計器一直提示縮放到 100%, 如果不重啟到 100%,設計的控制項會亂飛.

建立測試程式

  1. 新建.net windows 窗體應用 (winform)工程

  1. 選擇.net6.0

  1. 將窗體尺寸定為 1000 x 1000 , 用於後面檢測縮放是否正確

  1. 添加一個按鈕 , 尺寸定為 150 x 50

  1. 添加一個圖片框 , 尺寸定為 300 x 300 , 右鍵導入一張圖片

  1. 添加測試代碼
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
        }

    }
}
  1. 運行看看效果: net6 下運行,尺寸都是對的

正式開始

  1. 右键工程,添加应用程序清单 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>
  1. 雙擊工程名稱, 編輯配置文件

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>
  1. 如果提示找不到控制項, 在 form1.designer.cs 和 form1.cs 添加
using System;
using System.Windows.Forms;
  1. Program.cs注释掉 ApplicationConfiguration.Initialize();

  2. 运行选择 net461

備註:我的屏幕是 2800 x 1800 ,縮放 175%

果然, 顯示尺寸不對

  1. form1.cs 添加 'autoscalemode = autoscalemode.dpi;'
public Form1()
{
    AutoScaleMode = AutoScaleMode.Dpi; //添加这句,要在'InitializeComponent();'上方
    InitializeComponent();
}

再次運行

完美!

  1. 雙擊編輯窗體,沒有提示 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

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2024/2/29

winform中也可以這樣做數據展示

在做winform開發的過程中,經常需要做數據展示的功能,之前一直使用的是gridcontrol控制項,今天想通過一個示例,跟大家居間一下如何在winform blazor hybrid中使用ant design blazor中的table組件做數據展示。

继续阅读
同分类 / 同标签 2024/2/29

winform的界面也可以變好看?

前幾天跟大家居間了在winform中使用blazor hybrid,而且還說配上blazor的ui可以讓我們的winform程式設計的更加好看,接下來我想以一個在winform blazor hybrid中繪圖的例子來進行說明,希望對你有所幫助。

继续阅读