Размытие шрифтов 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
Ответы
Ответ 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