Випуск розмитих шрифтів WPF - Рішення


153

Проблема описана та продемонстрована за наступними посиланнями:

Пояснення: Чіткість тексту у WPF . Це посилання має порівняння шрифтів.

Я хотів би зібрати всі можливі рішення цієї проблеми. Microsoft Expression Blend використовує WPF, але шрифти виглядають читабельними.

  • Темний фон, як у Microsoft Expression Blend
  • Збільшення розміру шрифту та зміна шрифту (Calibri ...) [посилання]
  • Вставити форми Windows [посилання]
  • Використовуйте клас GDI + та / або клас Windows Forms TextRenderer для відтворення тексту в растрову карту, а потім виведіть цю растрову карту як елемент керування WPF. [посилання]

Чи є ще рішення?

Це буде зафіксовано у бета-версії VS2010 (та WPF4)

ГОЛОСУЄТЬСЯ, ЯК ВІНШЕ РОШЕНО!

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


VS2010RC абсолютно непридатний для мене mpdreamz.nl/vs2010RC-blur.png
Martijn Laarman

VS2010RC на моїй машині виглядає набагато краще, ніж на вашому знімку, насправді з білим тлом це дуже добре, але все одно смокче з темним фоном.
Роберт Вукович

Чи знайшли ви вирішення цього питання? Насправді в моїй заявці є та сама проблема, і я використовую WPF 3.5 з VS2010
SharpUrBrain

Останні 3 посилання мертві.
SHIN JaeGuk

Відповіді:


107

Технічні передумови

Існує поглиблена стаття про візуалізацію тексту WPF від одного з менеджерів текстової програми WPF на windowsclient.net: Ясність тексту у WPF .

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

Різниця очевидна, якщо порівнювати класичний візерунок «каскаду». WinForms у нижній лівій частині, WPF у верхній правій частині:

Хоча я і не шанувальник ідентифікацій шрифту WPF, я можу собі уявити нахабство, якби анімації стрибали так, як це роблять у каскаді Winforms.

Граючи з реєстром

Мене особливо зацікавило посилання на статтю MSDN " Налаштування реєстру ClearType ", в якій пояснюються можливі коригування користувача в реєстрі:

  • Рівень ClearType: кількість натяку на субпіксель
  • Рівень гамми
  • Структура пікселів: як розташовані кольорові смуги в пікселі дисплея
  • Рівень контрасту тексту: регулює ширину стебла гліфа, щоб зробити шрифт важчим

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

Ще один підхід

Найкращою порадою, яку надала стаття «Чіткість тексту», було збільшення розміру шрифту та зміна шрифту. Calibri працює для мене краще, ніж стандартний інтерфейс Segoe. Через свою популярність як веб-шрифту, я також спробував Verdana, але він має неприємний стрибок у вазі між 14pt і 15pt, що дуже видно при анімації розміру шрифту.

WPF 4.0

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

порівняння подання тексту

<grumble> Це повинно бути достатньо мотузки для кожного дизайнера. </grumble>


11
відмінне пояснення, +1. Напевно, пояснюється, чому Flash має і таке жахливе відображення шрифту.
Джефф Етвуд

1
Так. Це хороше пояснення, але я все ж хочу, щоб було способом увімкнути натяк на шрифт для гарного вигляду, коли ви знаєте, що не збираєтесь анімувати. Я припускаю, що це означатиме задану шкалу, для якої ви оптимізуєте натяк. Такі речі змушують WPF все ще бути бета-версією для мене.
PeterAllenWebb

Це не так, як "масштабований" варіант не використовує натяк на шрифт, це просто те, що WPF не оптимізує для потрапляння в піксельну сітку, як це робить ClearType. Можливо, SnapToDevicePixels повинен працювати над текстом, але це завжди має бути успадковано, оскільки контроль не може знати, може він оснаститися чи ні.
Девід Шмітт

2
Особливо актуальною є властивість TextOptions.TextFormattingMode ( msdn.microsoft.com/en-us/library/ee169597.aspx ). WPF4 та Silverlight також мають властивості UseLayoutRounding ( msdn.microsoft.com/en-us/library/dd783605.aspx ) та SnapsToDevicePixels ( msdn.microsoft.com/en-us/library/… ).
Пат

@All: Я не можу знайти спосіб вимкнення антизшивання тексту в WPF3.5, і в результаті текст мітки чи кнопки виглядає дуже погано. В ідеалі я хотів би вимкнути антисеансинг у всьому світі для шрифтів. Як я можу це досягти?
SharpUrBrain

128

.NET 4 нарешті має рішення для поганої якості передачі тексту WPF, але це добре приховано. Встановіть наступне для кожного вікна:

TextOptions.TextFormattingMode="Display"

Значення за замовчуванням - "Ідеальне", яке зовсім не те, що означає назва.

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


Усі. Дякую. Це допомагає мені вирішити проблему, але вам потрібно лише визначити це один раз у контейнері, як <grid>
Peter Du

Так, і якщо ви встановите його у вікні, він дійсний для всього, що міститься у ньому.
Хельге Кляйн

Витрачали багато часу на це, шукаючи багато сайтів і блогів, які продовжують роботу над тим, наскільки краще форматування тексту у VS2010 RTM / .Net 4 (я згоден, так!). Але жоден з них не хотів згадати, як ви можете робити WPF-додатки, які ви створюєте за допомогою нього, теж добре виглядайте. Чому це майно так добре приховано? Велике спасибі.
M-Peror

5
Все, що я хочу, це це! Мені справді все одно, наскільки витонченим є WPF-рендерінг, шрифти нікому не прийнятні.
Джеррі Лян

1
"Ідеально" працює для мене, а не "Дисплей". Проект працює на .NET 4.6.2. Можливо, вони виправили заплутане ім’я.
Джо

40

Я зіткнувся з проблемою днями, коли я застосував рамку, на якій застосовано 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>

Це прекрасно зробило трюк. Трохи хак, але краще, ніж возитися з налаштуваннями тощо. Хороший. Дякую. Одначе, що мені довелося зробити, це встановити заливку прямокутника на щось. Можливо, це була лише моя установка.
HAdes

Так, ти маєш рацію ... прямокутник за замовчуванням прозорий, що робить тінь, що падає, виглядати дивно.
Ісак Саво

це не відбувається в моїй вибірці програми, я використовую WPF 3.5
SharpUrBrain

@SharpUrBrain: що не відбувається? Чи все-таки вона розмита навіть після використання мого другого прикладу?
Ісак Саво

Так, вона все ще розмита після використання другого прикладу
SharpUrBrain


6

SnapToDevicePixels стосується лише форм WPF (ліній тощо), а не для текстового візуалізації.

Невідомо вирішення цього питання. За твердженням Microsoft, поведінка - "задумом".

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


Виправлено в WPF 4 за допомогою вкладеного властивості TextOptions.TextFormattingMode ( msdn.microsoft.com/en-us/library/ee169597.aspx ).
Пат

1
Назва властивості "SnapsToDevicePixels", а не "SnapToDevicePixels", як написано.
Нір Корнфельд

6

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

Зараз я створив квиток на Microsoft Connect для цієї проблеми (на мій подив, не дивлячись на весь негатив, фактичного звіту про помилки у визначеному трекері не було).

Оскільки це один з офіційних каналів передачі запитів та запитань Microsoft, я б радив також пройти його для швидшої відповіді. Принаймні, якщо ви хочете вирішити це питання так чи інакше, голосування за цей квиток та / або підтвердження питання допоможе привернути увагу прем’єр-міністрів та інженерів Microsoft до цієї проблеми та, можливо, підвищить її сприйнятий пріоритет.


6

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

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/isissue/889


4

Щойно випробував бета-версію VS2010, що все зроблено у WPF, і вона страждає BADLY від проблеми розмитого шрифту. Зокрема на підказках.

Це, мабуть, дає певні докази того, що WPF4 насправді не вирішить проблему (якщо щось буде гірше)


3
Я подаю помилки на VS2010B1 для кожного місця в інтерфейсі, текст розмитий. Підказки майже комічно погані, я згоден. З огляду на те, як явно було сказано, що це має бути зафіксовано в WPF4, я можу лише сподіватися, що він просто не зробив скорочення для цієї бета-версії.
Буде Дін

4

Нічого собі, я не можу повірити, що я нарешті отримав свої читальні шрифти WPF. І я також не можу повірити, що немає діалогового вікна параметрів, щоб спростити ці зміни, тоді як на моєму екрані значення за замовчуванням жахливі.

Ці параметри реєстру (у десятковій частині) працювали для мене і наближалися до мого звичайного чіткості шрифту:

  • ClearTypeLevel: 10 (здебільшого згладжування відтінків сірого)
  • GammaLevel: 1300 (вища гамма зробила шрифт занадто тонким, і я бачив кольори в псевдонімі)

3

Вони кажуть, що "SnapToDevicePixels = true" працює, але я ніколи не бачив хороших результатів.

Я борюся з розмитим текстом, переходячи на інший шрифт.

Очевидно, це не є вирішенням проблеми, однак я так працював над цим.


Я просто порівняв TextBlock з SnapToDevicePixels = «істинний» з одним без і не було ні різниці з Segoe UI шрифт на 12duis. Чи можу я запитати, які шрифти ви використовуєте?
Девід Шмітт

Ми також покращили ситуацію, змінивши наш шрифт. Шрифт, який ми вибрали, був Avenir (я не думаю, що він встановлений за замовчуванням, принаймні, не в Windows XP).
cplotts

0

Якщо ви віддаєте перевагу використовувати базовий клас C # для налаштування вікон для вашої програми (або тепер у вас є причина), ось як ви можете встановити форматування тексту для використання привабливого режиму відображення:

public class SnappyWindow : Window
{
    public SnappyWindow()
    {
        SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.