Почему я вижу пиксели при масштабировании приложения WPF в Windows?
Я разработал графический интерфейс для случайного приложения с использованием WPF. У меня есть куча готовых элементов управления WPF в окне приложения. Я ничего не настраивал, не использовал растровые изображения и т. Д.
При запуске моего приложения и масштабировании с помощью приложения "Лупа" в Windows 7 (Win key + Plus key
увеличенный графический интерфейс показывает пиксели. Я, вероятно, ошибаюсь, потому что я не могу объяснить это иначе, но разве WPF не должен обеспечивать вектор, как управляющий рендеринг?
Спасибо за участие в обсуждении.
Бонус Чтение
- Тим Снит: Лупа: интересное открытие ( архив)
- WPF Векторный интерфейс *(снимок экрана с векторным масштабированием WPF с помощью лупы)
- Блоги MSDN: Грег Шехтер объясняет, почему это происходит дольше ( архив)
4 ответа
Вернемся к тому моменту, когда впервые появилась Vista, и когда WPF был в версии 3.0, масштабирование с помощью встроенной лупы фактически выполняло бы векторное масштабирование.
Это перестало работать, когда WPF 3.5 с пакетом обновления 1 поставляется. (Это работало в 3.5 до sp1.) Причина, по которой он работал до того, состоит в том, что DWM (менеджер окон рабочего стола) - часть Windows, отвечающая за представление всего, что вы видите на экране - использует MILCORE.DLL для своего рендеринга. Версии 3.0 и 3.5 WPF также использовали этот же компонент для рендеринга - это означало, что весь контент WPF был, так сказать, нативным. (На самом деле, в Windows XP, в которой нет DWM, WPF - это то, что WPF ставит в вашу систему для собственной выгоды. Но он встроен в Vista и Windows 7.) Когда WPF использовал MILCORE.DLL для Для рендеринга в Vista любые эффекты, применяемые DWM, такие как масштабирование, также будут применяться так, как вы хотите в WPF - он действительно масштабировался без пикселей.
К сожалению, это больше не так. И причина в том, что WPF начал добавлять новые функции рендеринга. В версии 3.5 sp1 новой особенностью была поддержка пользовательских пиксельных шейдеров. Чтобы включить это, Microsoft должна была выпустить обновление MIL. (Media Integration Layer - бит, который выполняет фактический рендеринг.) Однако они не были в состоянии обновить MILCORE.DLL, потому что это часть Windows - это то, как все, что вы видите на экране, становится на экране. Выпуск новой версии MILCORE.DLL фактически означает выпуск обновления для Windows. Расписание выпуска для Windows не зависит от расписания для.NET, и поэтому единственный способ, которым команда WPF могла разумно добавить новые функции, - это отправка нового MIL. (Теоретически они могли бы сделать это через Центр обновления Windows, но поскольку WPF сейчас принадлежит другому подразделению Microsoft, чем Windows, на практике такого рода вещи не случаются.)
Начиная с версии.NET 3.5 sp1, MIL находится в другой библиотеке DLL, которая называется wpf_gfx_vXXXX.dll, где vXXXX - номер версии. В.NET 4.0 это wpf_gfx_v0400.dll.
Положительным моментом является то, что WPF добавляет новые функции рендеринга с каждой новой версией без необходимости обновления самой Windows. Недостатком является то, что рендеринг WPF больше не так тесно интегрирован с Windows, как это было на короткое время назад, когда вышла Vista. И результат, как вы видели, это увеличение не так весело, как раньше.
Приложение лупы реализует свой собственный рендеринг увеличенного изображения, поэтому вы видите пиксели. WPF использует векторную графику, но в этой ситуации не само приложение WPF отображает увеличенное изображение.
Если вы используете что-то вроде Snoop, вы можете увидеть увеличенную и масштабированную рендеринг векторной графики WPF в действии.
Я полагаю, лупа Windows 7 делает снимок реального экранного интерфейса приложения, а затем увеличивает его сам (не делая особого случая для приложений WPF). Конечно, он может получить доступ только к пикселям, а не к векторной графике, которая работает за сценой.
Windows-7-лупа основана на пикселях, но есть разница в режиме лупы в зависимости от того, активна ли Aero-тема или нет.
- с темой Арео зум является пиксельным.
- без темы Арео масштаб сглаживается (размыто).
Только с темой Арео можно выбрать другие виды (кроме "Прикрепленные").