C# Windows 10高DPI屏幕上的WPF应用程序模糊

C# Windows 10高DPI屏幕上的WPF应用程序模糊,c#,wpf,windows-10,highdpi,C#,Wpf,Windows 10,Highdpi,WPF应用程序在高DPI屏幕上是否正常进行开箱即用(无需进一步定制清单等)。我的理解是他们这么做了 我编写的两个WPF应用程序在我的新笔记本电脑(运行Windows 10)上的屏幕上显示都很模糊。通常,笔记本电脑的主显示器设置为外部低dpi显示器,内置笔记本电脑面板的缩放比例为125%。但是,无论是否插入低dpi监视器,都会出现模糊 我认为这可能与我的两个应用程序的启动方式有关(通过一个主方法,而不是启动主窗口的默认代码模板),但我刚刚启动了Visual Studio 2015,并使用项目模板生

WPF应用程序在高DPI屏幕上是否正常进行开箱即用(无需进一步定制清单等)。我的理解是他们这么做了

我编写的两个WPF应用程序在我的新笔记本电脑(运行Windows 10)上的屏幕上显示都很模糊。通常,笔记本电脑的主显示器设置为外部低dpi显示器,内置笔记本电脑面板的缩放比例为125%。但是,无论是否插入低dpi监视器,都会出现模糊

我认为这可能与我的两个应用程序的启动方式有关(通过一个主方法,而不是启动主窗口的默认代码模板),但我刚刚启动了Visual Studio 2015,并使用项目模板生成了一个全新的WPF应用程序(只需空白表单上的两个单选按钮)在我的系统上,它也不能扩展到高DPI


还值得一提的是,我已在我的windows副本上配置了“首选外部清单”注册表设置,以允许每个应用程序使用清单禁用高dpi扩展。(即
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide“PreferExternalManifest”=dword:00000001
)。

任何依赖于PresentationCore的程序都会自动识别DPI。这需要时间

您肯定遇到了另一个问题,WPF应用程序不会自动支持每监视器dpi感知。自Windows 8.1以来可用的功能。如果将主显示器安装在外部显示器上,则很可能会出现这种情况,您可能会为其设置不同的DPI设置,现在笔记本电脑屏幕上的windows将被迫使用相同的DPI设置,除非他们明确选择加入。或者考虑简单地让你的笔记本电脑的屏幕成为主显示器,很容易用显示小程序来回切换。

从WPF应用程序开始,默认为每个监视器DPI,而不是在较早版本:

WPF应用程序现在已启用每监视器DPI感知。这 对于多个屏幕显示 不同的DPI级别连接到一台机器。全部或部分 WPF应用程序在监视器之间转换,预期 行为是WPF自动将应用程序的DPI与 屏幕。现在是这样。在WPF应用程序中启用每监视器DPI感知


因此,请安装.4.6.2开发工具,并将您的应用程序定向到4.6.2,以获得对此的支持。

假设您运行的版本足够高(根据另一个答案,是4.6.2),下面将执行此操作。我在Window.Current.Activate()之后不久运行它:


嗨,汉斯-谢谢你的回答。似乎我需要做的就是添加多监视器支持。有趣的是,在我之前尝试时,断开低dpi(外部)监视器并没有清除渲染,但我想我只是错过了断开监视器后重新启动机器(或至少注销)的步骤。将笔记本电脑屏幕设置为主显示也没有修复模糊渲染-直到我重新启动(windows警告您,在您更改主显示时注销之前,某些应用程序不会响应缩放更改)。4.6.2根据Microsoft的规定,默认情况下使每个监视器的WPF应用程序都可以感知。看我的回答,这不是真的。WPF应用程序可以选择从.NET Framework 4.6.2开始的每监视器DPI感知模式,默认情况下不启用此行为。@rohit21agrawal我只引用了Microsoft博客,这表示支持
  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;
    }