Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325

[WPF] Сглаживание шрифта

17.06.2017, 00:54. Показов 4448. Ответов 18

Студворк — интернет-сервис помощи студентам
В моём приложении довольно часто используется текст малого размера (12-13 пт) - отображение просто ужасное.

Привожу пример своих настроек текста:

XML
1
2
3
SnapsToDevicePixels="True" FontFamily="Segoe UI" Foreground="#323232" 
TextOptions.TextFormattingMode="Display" 
TextOptions.TextRenderingMode="ClearType"
На изображении ниже представлено приближение моего шрифта (снизу) и шрифта Антивируса Касперского (сверху - такого результата желаю достичь).

К сожалению, субпиксельное сглаживание здесь не помогает (ClearType). И не предлагает что-то мудить с TextOptions... Я почти все варианты перепробовал и выходит одинаково плохо )=
Миниатюры
[WPF] Сглаживание шрифта  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.06.2017, 00:54
Ответы с готовыми решениями:

WPF: выбор шрифта
Добрый день. В wpf есть диалоговое окно выбора шрифтов? Если есть, то как поставить выбранный шрифт в textbox?

Подключение шрифта в WPF
Добрый день. Подскажите пожалуйста как можно подключить свои шрифты в проест. В статье "Встраивание шрифтов"...

Изменение параметров шрифта в WPF
В WF в RTF контроле было свойство Selection и с его помощью можно было менять все параметры шрифта в выделенном тексте. В WPF так не...

18
HF
 Аватар для HF
1317 / 897 / 200
Регистрация: 09.09.2011
Сообщений: 2,692
Записей в блоге: 2
17.06.2017, 09:39
WPF4 / 4.5 ? Там вроде бы разный рендеринг.
Советую только "поиграть" с режимом: Ideal/Display и Auto/ClearType. В некоторых случаях оно лучше выглядит.
0
 Аватар для Barrent
252 / 128 / 54
Регистрация: 04.05.2013
Сообщений: 346
17.06.2017, 11:33
Честно говоря не вижу разницы между двумя вариантами. Что за задача то? UI нужно отобразить на большом экране с низким разрешением?
0
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
17.06.2017, 12:41  [ТС]
Нет. Просто отобразить на обычном экране. Вопрос скорее дизайнерский, но решение его программное)
Как же нет разницы? Разница - рябь букв. Лично мне это сильно заметно, когда текста побольше, а не пара букв.

HF, Лучше не выглядит как ни крути.

P.S. Используется WPF 4.5.
0
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
17.06.2017, 13:40  [ТС]
Вот ещё скрин
Миниатюры
[WPF] Сглаживание шрифта  
0
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
17.06.2017, 14:14  [ТС]
Разница очевидна (справа просто прекрасный шрифт)!
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
17.06.2017, 15:29
Попробуйте SnapToDevicePixel="True"
0
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
17.06.2017, 15:32  [ТС]
Вы вообще вопрос прочли?

Добавлено через 56 секунд
Видимо нет. Т.к. иначе вы бы увидели что привязка эта уже используется.
0
HF
 Аватар для HF
1317 / 897 / 200
Регистрация: 09.09.2011
Сообщений: 2,692
Записей в блоге: 2
17.06.2017, 15:51
Могу только предложить ещё
C#
1
RenderOptions.ClearTypeHint="Auto"
Но честно сказать разницы не вижу, да и не понимаю зачем сравнивать через микроскоп. У вас устройство с экраном 320*200? Где вы увидите подобный результат?
0
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
17.06.2017, 15:54  [ТС]
Так не работает тоже.
Не знаю как вам, но лично мне разница на скрине глаза режет.
0
95 / 54 / 10
Регистрация: 16.09.2012
Сообщений: 207
21.06.2017, 01:47
dm stark, В WPF шрифты, это всегда проблема.
Раньше бороться с этой проблемой можно было 2мя путями. Либо увеличивать шрифт, либо менять шрифт (для меня шрифт Калибри работал без нареканий).
Напиши шрифт, который используешь ты.
Кстати, лично для меня всегда работал TextOptions.TextFormattingMode=”Ideal” и без TextOptions.TextRenderingMode="ClearType ".
Но я думаю, что ты уже всё это перепробовал)
Если ты на 100% уверен, что у вас с касперским одинаковые шрифты используются, то нужно крутить только эти настройки. Так как wpf больше ничего не предоставляет. Хотя, понятное дело, что на качество отображения шрифтов в wpf влияет много факторов. Начиная тенями и заканчивая размытием и другими эффектами. Но у тебя этого, вроде бы, нет. Если шрифты разные, то совпадения результатов не будет.
0
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
21.06.2017, 11:39  [ТС]
Я не говорил, что у меня один и тот же с Касперским шрифт. Я как раз этого хотел бы.
Да, все настройки TextOptions я перепробовал.
На данный момент использую Segoe UI и считаю, что вся проблема в нём.
Я бы хотел определиться не столько с настройками, сколько найти нужный шрифт, для которого потом эти настройки я подберу. Так же, возможно, решение проблемы кроется в размере. Я использую (на изображении) размер в 12 px. Segoe UI при таком размере может искажаться.
0
95 / 54 / 10
Регистрация: 16.09.2012
Сообщений: 207
21.06.2017, 13:26
dm stark, А, понял. Мне просто показалось, что ты уверен, что шрифты у вас одинаковые.
Я, в своём ответе выше, написал, что варианта у тебя только два: менять шрифт, либо менять размер шрифта.
Настройки TextOptions у тебя в порядке. Я обычно просто оставляю TextOptions.TextFormattingMode="Display" и всё. Обычно этого достаточно. Я бы сглаживание вообще убрал (убрал бы TextOptions.TextRenderingMode="ClearType "). Но я все эти советы даю вслепую, поэтому, ясное дело, что нужно смотреть результат.
Так же, я писал выше, что попробуй начать со шрифта Calibri. Раньше он себя хорошо зарекомендовал. Ну а вообще, перебирать шрифты можно бесконечно. Я уже не говорю о том, что касперские вполне могут использовать какой-нибудь покупной шрифт, которые они за деньги купили.
Segoe UI да, использовать нельзя как мелкий шрифт. Он ведёт себя ужасно. Хотя сейчас, в WPF 4.5 ситуация с ним всё равно немного лучше.

Добавлено через 21 минуту
dm stark,
Если общая концепция тебе позволяет, то постарайся заменить шрифт на другой. Если этого сделать нельзя, то попробуй увеличить и сделать шрифт не 12px, а 12.5px. Начни с малого и постепенно увеличивай (до разумных пределов), делай скриншоты и сравнивай с тем, что у тебя на 12 пикселях.
Основная проблема, почему так происходит, это потому, что WPF использует свою прорисовку, которая отличается от прорисовки в приложениях, где используется прорисовка на основе GDI. GDI может изменять формы мелких букв и выравнивать их по границам пикселей. В WPF всё по другому. ПОэтому у тебя и размытие происходит. Потому что буквы не выровнены по границам пикселей. В WPF есть опция TextOptions.TextFormattingMode, установив которую в Display, можно добиться эффекта отображения текста в стиле GDI. Но если это не помогает, то у тебя только 2 варианта. Либо менять шрифт, либо увеличивать его размер.
Если ты меняешь шрифт, то тут тоже нужно знать, что в WPF проблема со шрифтами комплексная. Она не касается какого-то одного шрифта. Она касается абсолютно всех шрифтов. Просто некоторые шрифты позволяют уменьшать себя чуть сильнее и не размываться, а некоторые шрифты вообще лучше не уменьшать. Но в конечном итоге, любой шрифт будет иметь размытость, просто в разной степени. Я уже не говорю о том, что размываться шрифт может по разному, в зависимости от разрешения экрана (на мониторе 96dpi ситуация одна, на мониторах с другим dpi ситуация может быть другой). Всё это плата за то, что WPF использует свою прорисовку, вместо GDI/GDI+. WPF использует DirectX и всё, что касается графики, проходит через directx. Благодаря этому получается выйгрыш от аппаратного ускорения, мы можем в WPF делать крутые переходы и градиенты, которые отображаются непосредственно видеокартой, а GDI так делать не может, он всю графику преобразует в инструкции рисования пикселей и поэтому отображение на GDI всегда значительно медленнее. И всё это далеко не все преимущества прорисовки WPF. Но за всё это приходится платить. И проблемы с размытием небольших размеров шрифтов, это одна из многих так "плат".
По моему я тебе дал исчерпывающий ответ по твоей проблеме. Если еще вопросы будут, то пиши.
1
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
24.06.2017, 13:08  [ТС]
Спасибо за пояснения. Причина проблемы ясна.

Я попробовал, как вы и предложили, поменять размер текста с использованием шрифтов Segoe UI и Calibri.
Ничего путного из этого не вышло. Может быть вы могли бы посоветовать ещё шрифты?

Добавлено через 4 минуты
И что интересно, в конструкторе окна шрифт отображает идеально.

Добавлено через 19 секунд
(В blend'е)
0
95 / 54 / 10
Регистрация: 16.09.2012
Сообщений: 207
24.06.2017, 16:48
dm stark, Хорошо, попробуй Verdana, Tahoma.
Так же, виожешь попробовать остальные шрифты, которые оптимизированы под ClearType. Их название обычно начинается с буквы 'c': Cambria, Calibri, Corbel, Candara, Consolas и тд. Так же, насколько я помню Georgia должна вести себя адекватно.
Я не советую тратить слишком много времени на эту задачу (учитывая, что ты уже потратил кучу времени на неё). Я бы на твоё месте просто выбрал бы наименее плохой результат из всех. А идеального отображения добиться очень сложно (уже объяснил почему). Хотя лично у меня, как я уже говорил, подобная проблема решалась и мне результат нравился (использовал шрифт вердана и калибри на 12,5 или 13 пикселей). Не знаю, может у меня просто глаз не такой дизайнерский)
0
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
23.07.2017, 13:24  [ТС]
А знаете в чём была проблема на самом деле?

Оказывается, если положить текст в бордер с тенью, то текст значительно ухудшается:

C#
1
2
3
4
5
6
<Border BorderThickness="1" BorderBrush="Black" Background="White">
       <Border.Effect>
                <DropShadowEffect BlurRadius="5" Color="Black"/>
       </Border.Effect>
       <TextBlock Text="Any text"/>
</Border>
Как решить проблему до сих пор не знаю...
Можно конечно просто добавить в этот Border Rectangle и для него делать тень, но это НЕ МОЙ СЛУЧАЙ. Тень должна быть именно для родительского элемента. Дело не в отображении.
0
HF
 Аватар для HF
1317 / 897 / 200
Регистрация: 09.09.2011
Сообщений: 2,692
Записей в блоге: 2
23.07.2017, 14:55
Цитата Сообщение от dm stark Посмотреть сообщение
если положить текст в бордер с тенью, то текст значительно ухудшается:
Теоритический совет - ищите возможные настройки управления бордером относительно объекта. А точнее - в разных граф.редакторах бордер располагается в 3 позициях - перед объектом (тогда при увеличении, он закрывает объект), на уровне объекта (при увеличении создаются границы "конфликта" объекта и бордера) и за объектом. Последний как раз работает так чтобы при увеличении не перекрывать и не конфликтовать. Вроде это называется Outline.
0
13 / 12 / 4
Регистрация: 20.05.2016
Сообщений: 325
23.07.2017, 15:01  [ТС]
Проблема глубже:

Добавлено через 1 минуту
Не пойму о чём вы. Можно какие то свойства или типы объектов указать?

Как я понял, вы предлагаете поустанавливать Panel.ZIndex в 0, -1, 1.

Добавлено через 1 минуту
Но ведь это ничего не решит...
0
0 / 0 / 0
Регистрация: 25.01.2017
Сообщений: 1
13.12.2017, 12:40
Я тоже уткнулся в эту проблему. Но у меня было чуть легче - часть окон имела нормальный вид текста, четкие буквы, а часть - неприятный, с зазубринами. Причем и шрифт, и все TextOptions в обоих случаях были одинаковыми, это было тщательно проверено. После долгих поисков, причину нашел: WPF can’t use ClearType when Window/Popup AllowsTransparency = true. This creates an HwndSource with UsesPerPixelOpacity = true (i.e. a layered window.)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.12.2017, 12:40
Помогаю со студенческими работами здесь

[WPF] Как создать кнопку увеличения шрифта?
Всем привет, можно ли реализовать увеличения шрифта при нажатии на кнопку: Использую библиотека Mvvm Ligh. Имеется переменная font_size...

WPF Установка шрифта
Добрый ночи. Вот такая проблема возникла никак не могу установить шрифт в программе. button1.FontFamily = new...

[WPF] Размер формы от шрифта и текста label и перемещение формы мышкой по label
Здравствуйте. Возможно глупый вопрос но я новичек в wpf. Как там сделать размер формы в зависимости от шрифта и текста label. И как сделать...

Изменение размера шрифта текста с разными размерами шрифта в RichTextBox
Добрый вечер! Возникла такая проблема - в RichTextBox находится текст, размер которого мы можем изменять из ComboBox. Т.е выделяем фрагмент...

Начать буквы малого шрифта от верха предыдущей большого шрифта
Есть текст большого шрифта, после которого идёт текст маленького шрифта, но первая маленькая буква находится на общем основании с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru