WPF Размытые шрифты - Решения - PullRequest
150 голосов
/ 10 октября 2008

Проблема описана и продемонстрирована по следующим ссылкам:

Объяснение: Четкость текста в WPF . Эта ссылка имеет сравнение шрифтов.

Я бы хотел собрать все возможные решения этой проблемы. Microsoft Expression Blend использует WPF, но шрифты выглядят читабельно.

  • Темный фон как в Microsoft Expression Blend
  • Увеличение размера шрифта и изменение шрифта (Calibri ...) [ссылка]
  • Вставить формы окон [ссылка]
  • Используйте класс GDI + и / или Windows Forms TextRenderer, чтобы отобразить текст в растровом изображении, а затем отобразить это растровое изображение как элемент управления WPF. [ссылка]

Есть ли еще решения?

Это будет исправлено в бета-версии VS2010 (и WPF4) 2

ЭТО СМОТРИТ, КАК ЭТО ПОЛНОСТЬЮ РЕШЕНО!

ComputerZen.com Скотта Хансельмана: WPF и текстовое размытие, теперь с полной ясностью

Ответы [ 11 ]

123 голосов
/ 02 марта 2011

.NET 4 наконец-то имеет решение для низкого качества рендеринга текста в WPF, но оно хорошо скрыто Установите следующее для каждого окна:

TextOptions.TextFormattingMode="Display"

Значением по умолчанию является «Идеально», что совсем не то, что подразумевает название.

Есть два других параметра в TextOptions, а именно TextHintingMode и TextRenderingMode, но оба имеют разумные значения по умолчанию.

103 голосов
/ 10 октября 2008

Техническое образование

Существует подробная статья о рендеринге текста WPF от одного из менеджеров текстовых программ WPF на windowsclient.net: Четкость текста в WPF .

Проблема сводится к тому, что WPF необходим линейный масштаб для визуализации шрифтов для плавной анимации. Pure ClearType, с другой стороны, занимает немного свободы с шрифтом, чтобы выдвигать вертикальные основы в следующий пиксель.

Разница очевидна, если сравнивать классический «каскадный» паттерн. WinForms в нижней левой части, WPF в верхней правой части:

image

While I'm no fan of WPF's font rendering idiosyncrasies either, I can imagine the clamor if the animations would jump like they do in the Winforms cascade.

Playing with the registry

Of special interest to me was the link to the MSDN article " Настройки реестра ClearType", что объясняет возможные пользовательские настройки в реестре:

  • Уровень ClearType: количество субпиксельных хинтов
  • Уровень гаммы
  • Структура пикселя: как располагаются цветные полосы в пикселе дисплея
  • Уровень контрастности текста: регулирует ширину основы глифа, чтобы сделать шрифт более толстым

Игра с этими настройками на самом деле не улучшила основной проблемы, но может помочь, уменьшив эффект цветового кровотечения для чувствительных пользователей.

Другой подход

Лучший совет, который дала статья Text Clarity, - это увеличение размера шрифта и изменение шрифта. Calibri работает для меня лучше, чем стандартный пользовательский интерфейс Segoe. В связи с его популярностью в качестве веб-шрифта, я тоже попробовал Verdana, но он имеет неприятный скачок в весе между 14pt и 15pt, что очень заметно при анимации размера шрифта.

WPF 4.0

В WPF 4 улучшена поддержка влияния на рендеринг шрифтов. В текстовом блоге WPF есть статья, объясняющая изменения. Наиболее заметно, что теперь есть (по крайней мере) три различных типа рендеринга текста:

text rendering comparison

Этого должно быть достаточно для каждого дизайнера.

36 голосов
/ 27 октября 2009

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

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

Вот так:

<!-- don't do this --->
<Border>
     <Border.Effect>
          <DropShadowEffect BlurRadius="25" ShadowDepth="0" Opacity="1"/>
     </Border.Effect>
     <TextBlock Text="This Text Will Be Blurry" />
</Border>

<!-- Do this instead -->
<Grid>
  <Rectangle>
     <Rectangle.Effect>
          <DropShadowEffect BlurRadius="25" ShadowDepth="0" Opacity="1"/>
     </Rectangle.Effect>
  </Rectangle>
  <TextBlock Text="This Text Will Be Crisp and Clear" />
</Grid>
10 голосов
/ 29 сентября 2009

Это будет исправлено в бета-версии 2 VS2010 (и WPF4):

image

6 голосов
/ 12 ноября 2008

С точки зрения разработчика, единственным известным «обходным путем» на сегодняшний день является использование класса TextRenderer GDI + и / или Windows Forms для отображения текста в растровом изображении, а затем визуализация этого растрового изображения в качестве элемента управления WPF. Помимо очевидных последствий для производительности, это не облегчает проблему для существующих приложений.

Я сейчас создал билет Microsoft Connect для этой проблемы (к моему удивлению, несмотря на все негативы, в указанном трекере не было фактического сообщения об ошибке).

Поскольку это один из официальных каналов передачи запросов и вопросов в Microsoft, я бы посоветовал также перейти к нему для более быстрого ответа. По крайней мере, если вы хотите, чтобы проблема была решена тем или иным образом, голосование за этот билет там и / или подтверждение проблемы помогут привлечь внимание менеджеров Microsoft и инженеров к этой проблеме и, возможно, повысить ее предполагаемый приоритет.

6 голосов
/ 10 ноября 2008

SnapToDevicePixels применяется только к фигурам WPF (линии и т. Д.), А не к средству визуализации текста.

Нет известного решения этой проблемы. По словам Microsoft, поведение «нарочно».

Также смотрите эту ветку на форумах Microsoft, где обсуждаются проблемы - она ​​получила несколько ответов от ребят из MS, которые разъясняют их позицию по этому вопросу.

4 голосов
/ 20 апреля 2014

Я не считаю это ошибкой, но конфигурация по умолчанию действительно очень раздражает. Вот сравнение всех комбинаций

TextOptions.TextRenderingMode
TextOptions.TextFormattingMode
RenderOptions.ClearTypeHint

SnapToDevicePixels не делает различий в рендеринге текста.

http://i.stack.imgur.com/cS3S2.png

Я предпочитаю:

TextOptions.TextRenderingMode="Auto"
TextOptions.TextFormattingMode="Ideal"
RenderOptions.ClearTypeHint="Auto"

где вертикальные линии никогда не размыты.

Используется шрифт Open Sans Light, который может быть очень красивым, если он хорошо используется, как в последней версии TeamViewer.

Для тех, кто использует Mahapps.Metro, проблема заключается в TransitioningContentControl https://github.com/MahApps/MahApps.Metro/issues/889

4 голосов
/ 10 июня 2009

Ничего себе, я не могу поверить, что наконец-то получил свои WPF-шрифты для чтения. И я также не могу поверить, что нет диалогового окна параметров, чтобы облегчить эти изменения, в то время как значения по умолчанию ужасны на моем дисплее.

Эти настройки реестра (в десятичном формате) работают для меня и наиболее близки к моему обычному шрифту cleartype:

  • ClearTypeLevel: 10 (в основном псевдонимы в оттенках серого)
  • GammaLevel: 1300 (более высокая гамма сделала шрифт слишком тонким, и я видел цвета в псевдонимах)
4 голосов
/ 20 мая 2009

Только что опробовал бета-версию VS2010, которая сделана в WPF, и она страдает от проблемы размытых шрифтов. Особенно в подсказках.

Кажется, это свидетельствует о том, что WPF4 на самом деле не решит проблему (если что-то выглядит хуже)

3 голосов
/ 10 октября 2008

Они говорят, что "SnapToDevicePixels = true" работает, но я никогда не видел хороших результатов.

Я борюсь с размытым текстом, переключаясь на другой шрифт.

Очевидно, что это не решение проблемы, однако я так обошелся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...