WPF Векторный интерфейс

Я работаю над новым приложением C# с использованием WPF. У меня сложилось впечатление, что WPF основан на векторах и что текст / кнопки будут нарисованы независимо от разрешения. При запуске моего приложения довольно очевидно, что мое приложение не рисуется с использованием векторов. Часть текста становится довольно блочной, и при использовании увеличительного стекла Windows вы можете видеть неровные края на всем.

Есть ли что-то особенное, что мне нужно сделать в моем приложении, чтобы включить векторную графику? Или что-то не так с моей конкретной машиной? (Я использую Windows Vista x64 с последними графическими драйверами)

2 ответа

Решение

Я собирался добавить это как комментарий, но я хочу, чтобы он был правильно процитирован и сносок.

Инструмент доступности Mangifier в Windows Vista раньше знал WPF. Если вы увеличите масштаб содержимого WPF, вы увидите резко увеличенную версию приложения, демонстрирующую, что WPF действительно основан на векторах.

Тим Снит, специалист по технологиям в Microsoft, написал об этом в 2006 году в блоге:

25.06.2011: оригинальное изображение исчезло. Заменено другим изображением, показывающим тот же эффект.

Грег Шехтер отвечает на некоторые комментарии в этом блоге, объясняя, что у лупы больше нет этого трюка. Лупа будет специально обнаруживать приложения WPF и знать, как попросить их сделать себя масштабированными. Они убрали зависимость от WPF в лупе. Кажется, что лупа зависела от чего-то в WPF, что они хотели убрать или удалить:

И "bp", и "Joseph Cooney" заметили, что увеличение содержимого WPF с использованием встроенного в OS Magnifier больше не делает независимое от разрешения масштабирование содержимого.

Это наблюдение верно.

В результате серии изменений, которые слишком многочисленны, чтобы описывать их здесь, лупа ОС больше не "поддерживает WPF" и выполняет растровое масштабирование так же, как и для другого контента. Несмотря на то, что мы утратили эту функцию, мы считаем, что без зависимостей, которые позволили Magnifier работать специфично для WPF, мы можем быть более гибкими в том, что мы предоставляем клиентам WPF в будущем.

Обратите внимание, что приведенное выше касается только увеличения вне процесса. Когда вы выполняете масштабирование (посредством масштабирования) в своем собственном приложении WPF, рендеринг продолжает повторно растеризовываться в более высоком масштабе, поэтому в этом наиболее распространенном сценарии все остается гладким. Это изменение касается только использования внешней лупы.

Таким образом, лупа имела его, но больше нет.


В канале 9 видео " Архитектура Грега Шехтера: Windows Presentation Foundation(WPF)" Грег Шехтер рассказал о том, как лупа использовалась для предоставления этой функциональности.

Лупа и DWM работали вместе. Лупа изменила граф сцены DWM, чтобы его клиентская область фактически указывала на корень сцены на рабочем столе. Затем DWM знал, что там есть лупа, и знал, как избежать этого ужасного эффекта "наведения видеокамеры на телевизор, показывающий видеокамеру".


Редактировать: 9/9/2018. Из ответа Яна Гриффитса:

Вернемся к тому моменту, когда впервые появилась 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. И результат, как вы видели, это увеличение не так весело, как раньше.

Увеличительное стекло в Vista не очень умное. Это просто взрывает уже растеризованное изображение с вашего экрана. Чтобы увидеть, что текстовое поле на самом деле является векторным, попробуйте настроить параметры DPI.

РЕДАКТИРОВАТЬ: Из комментариев, кажется, что увеличительное стекло в Vista, как предполагается, в конечном итоге сделать векторное масштабирование. Это, конечно, не на этом компьютере (Vista 32-разрядная версия), поэтому у меня могут быть те же проблемы. Масштабирование DPI работает, хотя...

Другие вопросы по тегам