适配win11系统缩放, WPF 高DPI设置

WPFDPI

有关系统DPI设置以及信息自行百度,在这我们只快速解决连接多显示器以及DPI修改后,WPF窗体字体等显示模糊问题,首先你要保证你的显示器本身显示不模糊哈, 不然看不出来效果

方式一(亲测有效):应用程序清单app.manifest

   使用应用程序清单,没有添加此配置,WPF默认DPI感知级别是在系统层面的,也就是你更改缩放率或者分别率后,WPF程序不会跟随变化,从而导致界面显示模糊

    1. 创建app.manifest文件,通过右键点击项目>添加>新建项>应用程序清单,进行添加。
    1. 修改清单文件以启用Per Monitor V2 DPI 意识
  • <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
    <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
        <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
        </windowsSettings>
    </application>
    </assembly>
    

方式二 :代码配置SetProcessDpiAwarenessContext

  如果你不想使用或无法修改应用程序的清单文件,你也可以在代码中设置 DPI 意识。需要注意的是这种方法是特定于 Windows 的,并且需要 P/Invoke。

  • 定义 P/Invoke 签名:

    • 在你的项目中定义对 SetProcessDpiAwarenessContext 函数的 P/Invoke 调用。
    using System;
    using System.Runtime.InteropServices;
    
    public static class DpiHelper
    {
        [DllImport("user32.dll", SetLastError = true)]
        private static extern IntPtr SetProcessDpiAwarenessContext(IntPtr dpiAwarenessContext);
    
        private static readonly IntPtr DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = new IntPtr(-4);
    
        public static void EnablePerMonitorV2DpiAwareness()
        {
            SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
        }
    }
    
  • 在应用程序启动时调用此方法:

    • 确保在创建任何窗口之前尽早调用这个方法,例如在 App.xaml.cs 文件中的 OnStartup 方法里。
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        DpiHelper.EnablePerMonitorV2DpiAwareness();
    }
    

方法三:使用 Application.SetHighDpiMode

  .NET Core 3.0 和更高版本引入了 System.Windows.Forms.Application.SetHighDpiMode 方法,虽然这是针对 Windows Forms 的 API,但在 WPF 应用中也有效。不过,对于 WPF 应用来说,通常推荐使用上面提到的方法一或方法二。

using System.Windows.Forms;

// 在应用程序启动前调用
Application.SetHighDpiMode(HighDpiMode.PerMonitorV2);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值