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

问题描述

我有一个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;
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...