【问题标题】:My WPF app is per-monitor dpi-aware out of the box. I was not expecting that?我的 WPF 应用程序是开箱即用的 per-monitor dpi-aware。我没想到?
【发布时间】:2016-03-08 10:44:24
【问题描述】:

我对 WPF 中的 per-monitor dpi-aware 有点困惑。我认为您需要做一些工作才能使您的窗口在不同的显示器上正确缩放(如Developing a Per-Monitor DPI-Aware WPF Application 中所述)。

但我刚刚在带有两个显示器(2560x1440 和 2160x1440)的电脑上运行了我的应用程序,当我在显示器之间移动对话时,它会自动缩放。那是在最新的快速环 Windows 10 上。我错过了什么吗?

【问题讨论】:

  • 只要您不对 UI 元素中的值进行硬编码,WPF 应用程序就会自动对其进行缩放。
  • @XAMlMAX 对于 Windows 8.1 也是如此吗?那我在帖子中链接的那篇文章呢?它确实说你必须自己听 dpi changed 事件。
  • 无关,但现在我很好奇;如果您的窗口位于两个显示器的中间,会发生什么情况?
  • @BTownTKD 您的窗口左上角位置是起点,因此如果您有MessageBox,它将出现在具有 Windows 左上角部分的监视器上。

标签: wpf scaling dpi-aware


【解决方案1】:

您看到的是当一个应用程序窗口移动到具有不同 DPI 的不同显示器时系统缩放的示例。这是因为 WPF 应用程序默认支持 System DPI Aware。因此,如果您仔细观察,您会看到 WPF 视觉效果/文本在目标 DPI 较高时变得模糊,或者在目标 DPI 较低时看起来模糊。 另外,请注意,显示器分辨率对于 WPF 应用程序并不重要,因为 WPF 与设备分辨率无关(它的测量单位是与设备无关的像素)。

好消息:.NET 4.6.2 预览版刚刚发布,它具有开箱即用的 Per Monitor DPI Awareness。在此处查看开发人员指南和示例:

https://github.com/Microsoft/WPF-Samples/tree/master/PerMonitorDPI

【讨论】:

    【解决方案2】:

    继续来自 cmets 的对话。
    是的,Windows 8.1 也是如此。
    这是您链接帖子中的注释

    Windows Presentation Foundation (WPF) 应用程序默认支持系统 DPI。

    HTH

    【讨论】:

    • 这是系统 DPI 感知的。这不是每个显示器的 dpi 感知。所以是的,当您在 Windows 中更改 DPI 设置时,WPF 应用程序会缩放,但在 Win10 中,您可以让不同的显示器以不同的 DPI 运行,据我所知,WPF 应用程序不支持开箱即用。
    • WPF 使用 DirectX 在显示器上显示任何内容,据我所知,这是直接使用您的 GPU 在屏幕上显示内容。因此,当您将应用程序从一个监视器移动到另一个监视器时,它将使用不同的绘图上下文。这将适用于多个连接,但是如果您使用分离器电缆,情况可能并非如此。 HTH
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 2015-02-25
    • 2013-11-25
    相关资源
    最近更新 更多