Проблема с размытыми шрифтами WPF - решения
проблема описана и продемонстрирована по следующим ссылкам:
- Павел Stovellбыл в WPF: размытый текст перевода
- www.gamedev.net форум
- Microsoft Connect: WPF text renderer производит плохо размытый текст на небольших размерах шрифта
объяснение: ясность текста в 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 объяснение изменений. Наиболее заметно, что в настоящее время (по крайней мере) существует три разных вида рендеринга текста:
этого должно быть достаточно для каждого дизайнера.ворчание>
.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>
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
не делает никаких различий в рендеринге текста.
Я предпочитаю:
TextOptions.TextRenderingMode="Auto"
TextOptions.TextFormattingMode="Ideal"
RenderOptions.ClearTypeHint="Auto"
где вертикальные линии не размытые.
используемый шрифт открыт без света, который может быть действительно красивым, если он хорошо используется, как в последнем TeamViewer.
для тех, используя Mahapps.Метро, проблема в TransitioningContentControl
https://github.com/MahApps/MahApps.Metro/issues/889
Они говорят, что "SnapToDevicePixels = true" работает, но я никогда не видел хороших результатов.
Я борюсь с размытым текстом, переключаясь на другой шрифт.
очевидно, что это не решение проблемы, однако именно так я работал над этим.