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

lp0sw83n  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(132)

我在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]
  • 在本机窗口中 Package WPF

所有的方法导致相同的无效窗口大小.请注意,DPI感知和DPI不感知模式之间的切换只会导致模糊的视觉效果和窗口内的锐利视觉效果,例如,如果我设置DPI感知到真正的按钮文本将是清晰和锐利.
下面是我准备的一个最小示例项目:https://github.com/CycloneRing/Issue-WPFWindowScaleDPI
有什么方法可以解决这个问题吗?我不想手动修改WPF窗口的大小。
125% vs 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,它总是使用窗口缩放值。

jgwigjjp

jgwigjjp1#

我认为在WPF应用中使用固定分辨率并不是一个明智的选择。大多数时候,开发人员很难限制用户的dpi选择,因为您可能永远不知道您的应用当前运行在什么样的硬件上。
因此,我建议你让你的应用程序dpi知道,这在WPF中是非常可行的。这将是一个好主意,你所有的控件和布局的大小取决于你的主窗口的实际大小。
以下是一些有用的链接:Windows Forms DPI scalingCreating a DPI-Aware Application

相关问题