问题描述
我有一个WPF项目,该项目根据APP的某些位置在不同的APP“ APP”上绘制窗口(如弹出窗口)。
这些窗口的位置是根据系统DPI(又称为主监视器的DPI)计算的。
当我在显示设置中更改主要DPI时,使用“旧”主要DPI计算窗口的位置,这会导致位置错误。
是否有某种方法可以执行这些计算,这些计算取决于主要DPI,使用“新”主要DPI而不是使用旧DPI?
我知道,当更改主要DPI时,Windows会警告我“某些应用程序只有在关闭并重新打开它们之后才能响应缩放更改。”,但我需要找到解决方法。
谢谢
解决方法
您将要研究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;
}