在Windows 10上高DPI屏幕下,WPF应用程序模糊。

4
WPF应用程序在高DPI屏幕上是否会自动适配(无需进一步自定义清单等)?我以为是这样的。但我的两个WPF应用程序在新笔记本电脑(运行Windows 10)的屏幕上显示模糊。通常,笔记本电脑的主显示器设置为外部低dpi监视器,内置笔记本面板缩放为125%。然而,无论低dpi监视器是否连接,都会出现模糊。我认为这可能与我两个应用程序的启动方式有关(通过主方法启动,而不是默认代码模板启动主窗口),但我刚刚启动了Visual Studio 2015,并使用项目模板生成了一个全新的WPF应用程序(只是一个空白窗体上的几个单选按钮),它也没有在我的系统中适配高DPI。另外值得一提的是,我已经在我的Windows副本上配置了“prefer external manifest”注册表设置,以允许每个应用程序禁用具有清单的高dpi缩放。
3个回答

5

.NET 4.6.2开始,WPF应用默认支持每个显示器的DPI感知,而早期版本不支持:

现在,WPF应用程序已启用每个显示器的DPI感知。这对于将多个DPI级别不同的显示器连接到单台计算机的情况非常关键。当WPF应用程序的全部或部分过渡到其他显示器时,预期行为是WPF自动将应用程序的DPI匹配到屏幕。它现在可以做到了。在之前的版本中,您需要编写额外的本地代码来启用WPF应用程序的每个显示器的DPI感知。

因此,请安装.NET 4.6.2 dev工具,并将您的应用程序定位到4.6.2以获取此功能的支持。


3
这并不是真的。WPF应用程序可以选择启用每个显示器DPI感知模式,从.NET Framework 4.6.2开始,但这种行为默认情况下是未启用的。 - rohit21agrawal
@rohit21agrawal 我只引用了微软的博客,这表明支持。 - magicandre1981

3
任何依赖PresentationCore的程序都会自动支持DPI感知。它需要一个属性来显式禁用它
你肯定有不同的问题,WPF应用程序不会自动支持每个监视器的DPI感知,这是自Windows 8.1以来可用的功能。如果主显示器在外部显示器上,则很可能会出现这种情况,您可能为其设置了不同的DPI设置,现在笔记本电脑屏幕上的窗口被强制使用相同的DPI设置,除非它们显式地选择加入。需要大量的艰苦工作。或者考虑将笔记本电脑的屏幕设为主显示器,可以轻松使用“显示”应用程序进行切换。

嗨,汉斯 - 感谢您的答案。似乎需要添加多显示器支持。有趣的是,在我之前尝试断开低dpi(外部)显示器时,不会消除渲染问题-但我想我只是忽略了在断开显示器后重新启动机器(或至少注销)的步骤。将笔记本屏幕设置为主显示器也无法解决模糊的渲染-直到我重新启动(当您更改主显示器时,Windows会警告您一些应用程序将在注销时不会响应缩放更改)。 - Daniel Scott
1
根据微软的说法,4.6.2版本默认使WPF应用程序支持多显示器。请参考我的回答。 - magicandre1981

1
假设您正在运行足够高的版本(根据另一个答案,为4.6.2),以下操作可以实现。我在 Window.Current.Activate() 之后立即运行它:
  double GetDpi()
    {
        var qualifiers = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().QualifierValues;
        double scale = 96;
        if (qualifiers.ContainsKey("Scale"))
        {
            string strScale = qualifiers["Scale"];
            double.TryParse(strScale, out scale);
        }
        return scale;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接