Проблема с размытыми шрифтами WPF - решения

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

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

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

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

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

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

улучшения стека текста WPF 4.0

ПОХОЖЕ, ЧТО ОН НАКОНЕЦ-ТО РЕШЕН !

Скотта Хансельмана ComputerZen.com: WPF и размытость текста, теперь с полным Ясность
текстовый блог WPF: дополнительные улучшения четкости текста WPF

10 ответов


техническая информация

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

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

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

хотя я не поклонник особенностей рендеринга шрифтов WPF, я могу представить себе шум, если анимации будут прыгать, как в каскаде Winforms.

игра с реестром

особый интерес для меня представляла ссылка на статью MSDN"Параметры Реестра ClearType", что объясняет возможную сторону пользователя корректировки в реестре:

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

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

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

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

WPF 4.0

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

text rendering comparison

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


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

TextOptions.TextFormattingMode="Display"

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

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


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

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

вот так:

<!-- 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>

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


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

нет решения этого вопроса. По словам Microsoft, поведение "по дизайну".

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


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

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

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


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

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


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

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

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

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

TextOptions.TextRenderingMode
TextOptions.TextFormattingMode
RenderOptions.ClearTypeHint

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

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

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

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

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

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

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


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

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

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