WPF Векторный интерфейс - PullRequest
1 голос
/ 02 апреля 2009

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

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

Ответы [ 2 ]

4 голосов
/ 01 июля 2009

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

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

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

enter image description here

6/25/2011: Исходное изображение исчезло. Заменено другим изображением, показывающим тот же эффект.

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

И «БП», и «Джозеф Куни» имеют заметил, что увеличение WPF контент с использованием встроенной ОС Лупа больше не делает разрешение независимое увеличение контента.

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

В результате серии изменений которые слишком многочисленны, чтобы описать здесь лупа ОС больше не «WPF-осведомлен» и выполняет растровое масштабирование так же, как это делает другой контент. Хотя мы теряем эту функцию, мы считаю, что без зависимостей что позволило лупе работать в WPF-специфичный способ, мы можем быть более гибкими в том, что мы предоставляем клиентам WPF двигаться вперед.

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

Так что у лупы он был, но больше нет.


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

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


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

Назад, когда Vista впервые поставлена, и когда WPF был на версии 3.0, масштабирование с помощью встроенной лупы на самом деле делает на основе вектора масштабирование.

Это перестало работать при поставке пакета обновления 1 для WPF 3.5. (Это сработало в 3.5 до sp1.) Причина, по которой он работал до того, заключается в том, что DWM (Desktop Window Manager) - часть Windows, ответственная за представить все, что вы видите на экране - использует MILCORE.DLL, чтобы сделать его рендеринг. Версии 3.0 и 3.5 WPF также использовали этот же компонент для render - это означало, что весь контент WPF был нативным, поэтому говорить. (На самом деле, в Windows XP, где нет DWM, MILCORE.DLL - это то, что WPF помещает в вашу систему самостоятельно. выгода. Но он встроен в Vista и Windows 7.) Когда WPF использовал MILCORE.DLL для визуализации в Vista, любые эффекты, применяемые DWM, такие как масштабирование также применимо так, как вы хотите к WPF - оно действительно масштаб без пикселей.

К сожалению, это уже не так. И причина в том, что WPF начал добавлять новые функции рендеринга. В 3.5 sp1, новая функция в Вопрос был в поддержке пользовательских пиксельных шейдеров. Чтобы включить это, Microsoft пришлось выпустить обновление MIL. (Медиа Интеграция Слой - бит, который выполняет фактический рендеринг.) Однако они не былидействительно в состоянии обновить 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 поставлялась. И результат это, как вы видели, это увеличение не так весело, как раньше будет.

0 голосов
/ 02 апреля 2009

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

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

...