Подтвердить что ты не робот

Размытие шрифтов WPF-Решения

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

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

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

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

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

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

Улучшения текстового стека WPF 4.0

ЭТО СМОТРЕТЬ, КАК ЭТО БЫЛО НАКОНЕЧНО РЕШЕННО!

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

4b9b3361

Ответ 1

Технический справочник

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

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

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

Fontcascade.png

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

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

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

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

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

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

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

WPF 4.0

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

text rendering comparison

<grumble> Это должно быть достаточно веревки для каждого конструктора. </grumble>

Ответ 2

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

TextOptions.TextFormattingMode="Display"

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

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

Ответ 3

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

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

Так же:

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

Ответ 4

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

Magna%20Carta%20Ideal%20vs%20Display%208pt%20annotated_4.png

Ответ 5

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

В этой проблеме нет известного способа обхода проблемы. По словам Microsoft, поведение "по дизайну".

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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

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

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

Ответ 10

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

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