无需重新启动应用程序即可处理主 DPI 的更改

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

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

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

谢谢

c# wpf windows dpi dpi-aware
2个回答
1
投票

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

然后,使用 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;
}

-5
投票

我可以修复,我的邮箱:[email protected]

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