【问题标题】:Handling change of primary DPI without restarting the app在不重新启动应用程序的情况下处理主要 DPI 的更改
【发布时间】:2020-10-14 14:37:35
【问题描述】:

我有一个 WPF 项目,它根据 APP 的某些元素的位置在不同的应用程序“APP”上绘制窗口(如弹出窗口)。
这些窗口的位置是根据系统 DPI(又名主显示器的 DPI)计算的。
当我在显示设置中更改主 DPI 时,窗口的位置是使用“旧”主 DPI 计算的,这会导致位置错误。
是否有某种方法可以执行这些取决于主 DPI 的计算,使用“新”主 DPI 而不是旧主 DPI?

我知道在更改主要 DPI 时,Windows 会提醒我“某些应用在您关闭并重新打开它们之前不会响应缩放更改。”但我需要找到解决方法。

谢谢

【问题讨论】:

  • 您可以使用 Window.DpiChanged 事件并计算位置

标签: c# wpf windows dpi dpi-aware


【解决方案1】:

您需要查看SystemEvents.DisplaySettingsChanged 事件,并编写一个在该事件发生时处理该事件的方法。我以前在 WPF 中做过这个,所以我知道它有效。

然后,使用the answer here by Ana Betts 计算主 DPI:

PresentationSource source = PresentationSource.FromVisual(this);

double dpiX, dpiY;
if (source != null) {
    dpiX = 96.0 * source.CompositionTarget.TransformToDevice.M11;
    dpiY = 96.0 * source.CompositionTarget.TransformToDevice.M22;
}

【讨论】:

  • 其实我已经有了获取主DPI的好办法。我需要的是您订阅 DPI 更改的答案以及一个静态类,该类存储最后一个主 DPI 值,直到用户更改设置。这样我总是使用“第一个”主 DPI。所以谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 1970-01-01
  • 2021-05-12
相关资源
最近更新 更多