WPFDPI
有关系统DPI设置以及信息自行百度,在这我们只快速解决连接多显示器以及DPI修改后,WPF窗体字体等显示模糊问题,首先你要保证你的显示器本身显示不模糊哈, 不然看不出来效果
方式一(亲测有效):应用程序清单app.manifest
使用应用程序清单,没有添加此配置,WPF默认DPI感知级别是在系统层面的,也就是你更改缩放率或者分别率后,WPF程序不会跟随变化,从而导致界面显示模糊
-
- 创建app.manifest文件,通过右键点击项目>添加>新建项>应用程序清单,进行添加。
-
- 修改清单文件以启用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);