wpf - TransformToDevice 在 Windows 8.1 上不返回正确的 DPI 系数

标签 wpf transform screen-resolution dpi dpi-aware

您好,我正在实现 DPI 感知应用程序,我想根据当前分辨率计算窗口的位置。

我在 Windows 8.1 上测试了以下代码,如果我们更改 DPI 设置,操作系统不会要求重新登录。 它立即应用 DPI。

  var presentationSource = PresentationSource.FromVisual(this);
  transform = presentationSource.CompositionTarget.TransformToDevice;

  int width = transform.m11 * SystemParameters.PrimaryScreenWidth;
  int height = transform.M22* SystemParameters.PrimaryScreenHeight;

但是如果我使用 mspanel 更改 DPI 而无需注销并重新登录,TransformToDevice() 将返回旧值 而不是新的。 我认为如果 DPI 设置发生变化,这个变换矩阵也会发生变化。

当 DPI 设置更改时我应该调用一个方法吗?

最佳答案

我不确定您环境的 DPI 设置,但由于您正在谈论“无需注销和重新登录”更改 DPI,我假设 Windows 8.1 的每显示器 DPI 功能已启用。

在Per-Monitor DPI环境下,显示器DPI可以立即更改,无需注销并重新登录,而系统DPI不会跟随更改,直到注销并重新登录。您的代码(看起来不完整)不过)是为了获取系统 DPI。相反,您需要使用 GetDpiForMonitor通过P/Invoke获取当前显示器DPI。

关于wpf - TransformToDevice 在 Windows 8.1 上不返回正确的 DPI 系数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26271887/

相关文章:

wpf - 删除 Windows 8 中控件上的 MouseOver 状态

jpa - Playframework 如何将query.ResultList转换为VO

c++ - 转换指向基类的指针列表

python - 如何在 Selenium WebDriver 中设置浏览器宽度和高度?

screen-resolution - Tinyscrollbar 不适用于拖动

android - 如何更改不同屏幕分辨率的 View ?

c# - 在代码隐藏之外的其他地方捕获事件

c# - DataGrid ScrollIntoView - 如何滚动到未显示的第一行?

c# - 附加属性以避免自定义控件

css - 如何禁用单击以在纯 css slider 上前进