2016-08-30 2 views
0

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

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

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

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

ответ

1

Любая программа, которая зависит от PresentationCore, автоматически распознается DPI. Требуется an attribute to explicitly disable that.

У вас, конечно же, другая проблема, приложение WPF не поддерживает автоматическую поддержку прозрачности для каждого монитора. Функция доступна с Windows 8.1. Наличие первичного дисплея на внешнем мониторе делает это очень вероятным, вы, вероятно, дали ему другое значение DPI, и теперь окна на экране вашего ноутбука вынуждены использовать тот же параметр DPI, если они явно не вступают. Takes a fair amount of gritty work. Или попробуйте просто сделать экран вашего ноутбука основным дисплеем, его легко переключить с помощью апплета Display.

+0

Hi Hans - спасибо за ваш ответ. Похоже, что добавление поддержки нескольких мониторов - это то, что мне нужно будет сделать. Любопытно, что отсоединение монитора с низким разрешением (внешний) не очистило рендеринг ранее, когда я его попробовал, но, по-моему, я просто не заметил, как перезапустить машину (или выйти из системы как минимум) после отключения монитор. Установка экрана ноутбука в качестве основного дисплея не устраняет нечеткого рендеринга либо до тех пор, пока я не перезапустится (окна предупреждают, что некоторые приложения не будут реагировать на изменения масштабирования до выхода из системы при изменении основного дисплея). –

+1

4.6.2 делает приложения WPF на монитор осведомленными по умолчанию в соответствии с Microsoft. См. Мой ответ – magicandre1981

1

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

WPF теперь включены для каждого монитора осведомленности DPI. Это улучшение имеет решающее значение для сценариев, в которых несколько дисплеев с разным уровнем DPI подключены к одной машине. Поскольку все или часть приложение WPF переходит между мониторами, ожидаемое поведение для WPF автоматически соответствует DPI приложения на экране . Это сейчас. In previous versions, you would have to write additional native code, чтобы включить распознавание DPI в мониторах WPF.

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

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; 
    } 
Смежные вопросы