缩放操作系统 DPI 上的 WPF 窗口大小不正确(DPI 感知/DPI 不感知)

问题描述 投票:0回答:1

我在 WPF 中面临一个奇怪的问题,假设我们有一个固定大小为 512x512 像素的窗口,现在当我们在具有 125% 缩放 DPI 的操作系统中运行此 WPF 应用程序时,创建的窗口大小将为 640x640 像素,这意味着原始大小大小乘以 1.25。

我希望我的窗口为 512x512,而不考虑操作系统的缩放值。我尝试了互联网上提供的所有解决方案:

  • app.manifest
     中设置 dpiAwaredpiAwareness
  • app.config
    中将 Switch.System.Windows.DoNotScaleForDpiChanges
  • 设置为 false
  • AssemblyInfo.cs
    中设置 [assembly: System.Windows.Media.DisableDpiAwareness]
  • 将 WPF 包装在本机窗口中

所有方法都会导致相同的无效窗口大小。请注意,在 DPI 感知和 DPI 不感知模式之间切换只会导致窗口内的视觉效果模糊和视觉效果清晰,例如,如果我将 dpi 感知设置为真实的按钮文本将会清晰锐利。

这是我准备的一个最小示例项目:https://github.com/CycloneRing/Issue-WPFWindowScaleDPI

有什么办法可以解决这个问题吗?我不想手动修复 WPF 窗口的大小。

125% 与 100% :

我想出的唯一解决方案是使用本机导入设置窗口大小:

private void WindowLoaded(object sender, RoutedEventArgs e)
{
  IntPtr hWnd = new WindowInteropHelper(this).Handle;
  SetWindowPos(hWnd, IntPtr.Zero, 0, 0, (int)this.Width, (int)this.Height, 0x0002 | 0x0004 | 0x0020);
}

但这并没有解决主要问题,这样做的一个副作用是 wpf 窗口内的单位仍然会乘以 1.25。

注意:我有一个理论,由于 WPF 窗口在 HwndWrapper 内部运行,也许 dpi 设置不会影响 HwndWrapper 并且它始终使用窗口缩放值。

c# wpf windows dpi
1个回答
0
投票

我想说,在 WPF 应用程序中使用固定分辨率并不是一个明智的选择。 大多数时候,开发人员很难限制用户的 dpi 选择,因为您可能永远不知道您的应用程序当前运行在哪种硬件上。

因此,我建议你让你的应用程序感知 dpi,这在 WPF 中是非常可行的。所有控件和布局的大小都取决于主窗口的实际大小,这是一个好主意。

以下是一些有用的链接: Windows 窗体 DPI 缩放 创建 DPI 感知应用程序

© www.soinside.com 2019 - 2024. All rights reserved.