Размытие приложения WPF на экране с высоким разрешением в Windows 10

Нормально ли приложения WPF правильно масштабируются на экранах с высоким разрешением из коробки (без дополнительной настройки манифеста и т. Д.?). Насколько я понимаю, они это сделали?

Два написанных мной приложения WPF выглядят размытыми на моем новом ноутбуке (под управлением Windows 10) при просмотре на экране ноутбука. Обычно основной дисплей ноутбука настроен как внешний монитор с низким разрешением, а встроенная панель ноутбука масштабируется на 125%. Однако размытость появляется независимо от того, подключен ли монитор с низким разрешением или нет.

Я думал, что это может иметь какое-то отношение к запуску двух моих приложений (через основной метод, а не через шаблон кода по умолчанию, который запускает главное окно), но я только что запустил Visual Studio 2015 и сгенерировал новый WPF приложение с шаблоном проекта (всего пара переключателей на пустой форме), и оно также не масштабируется до высокого разрешения в моей системе.

Также стоит упомянуть, что я настроил параметр реестра «предпочитать внешний манифест» в своей копии Windows, чтобы разрешить каждому приложению отключать масштабирование с высоким разрешением с помощью манифеста. (т.е. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide "PreferExternalManifest"=dword:00000001).


person Daniel Scott    schedule 30.08.2016    source источник


Ответы (3)


Любая программа, которая зависит от PresentationCore, автоматически поддерживает DPI. Требуется атрибут для явного отключите это.

У вас наверняка другая проблема: приложение WPF не поддерживает автоматическое распознавание точек на дюйм для каждого монитора. Функция доступна начиная с Windows 8.1. Наличие основного дисплея на внешнем мониторе делает это очень вероятным, вы, вероятно, задали ему другую настройку DPI, и теперь окна на экране вашего ноутбука вынуждены использовать ту же настройку DPI, если они явно не согласны. Требует значительного объема тяжелой работы < / а>. Или подумайте о том, чтобы просто сделать экран вашего ноутбука основным дисплеем, его легко переключать назад и вперед с помощью апплета Display.

person Hans Passant    schedule 30.08.2016
comment
Привет, Ганс - спасибо за ответ. Похоже, что мне нужно было бы добавить поддержку нескольких мониторов. Интересно, что отключение монитора с низким dpi (внешнего) не привело к очистке рендеринга раньше, когда я попробовал его, но тогда, я думаю, мне просто не хватало шага перезапуска компьютера (или, по крайней мере, выхода из системы) после отключения монитора. Установка экрана ноутбука в качестве основного дисплея также не устранила нечеткую визуализацию - до тех пор, пока я не перезапустился (Windows предупреждает вас, что некоторые приложения не будут реагировать на изменения масштабирования до выхода из системы при изменении основного дисплея). - person Daniel Scott; 30.08.2016
comment
4.6.2 по умолчанию сообщает приложениям WPF для каждого монитора. Смотри мой ответ - person magicandre1981; 30.08.2016

Начиная с .net 4.6.2 Приложения WPF по умолчанию поддерживают разрешение каждого монитора, а не в более ранней версии:

Приложения WPF теперь включены для поддержки DPI для каждого монитора. Это улучшение имеет решающее значение для сценариев, в которых к одному компьютеру подключено несколько дисплеев с различным уровнем DPI. Поскольку все или часть приложения WPF передается между мониторами, ожидается, что WPF автоматически сопоставит DPI приложения с экраном. Теперь это так. В предыдущих версиях вам пришлось бы писать дополнительный собственный код, чтобы включить распознавание DPI для каждого монитора в приложениях WPF.

Поэтому установите инструменты разработчика .4.6.2 и настройте свое приложение на версию 4.6.2, чтобы получить поддержку для этого.

person magicandre1981    schedule 30.08.2016
comment
это неправда. Приложения WPF имеют возможность выбрать режим осведомленности о DPI на мониторе, начиная с .NET Framework 4.6.2, это поведение не включено по умолчанию. - person rohit21agrawal; 24.03.2018
comment
@ rohit21agrawal Я цитировал только блог Microsoft, и это показывает поддержку - person magicandre1981; 24.03.2018

Предполагая, что вы используете достаточно высокую версию (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;
    }
person William Jockusch    schedule 23.11.2016