WPF: узнать реальные границы текста
От: HotDog Швейцария www.denebspace.com
Дата: 13.06.16 15:15
Оценка:
Я думал такие приколы сгинули в кану вместе с GDI+, ан нет и тут они нас догоняют.
Имеем
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Border BorderBrush="red" BorderThickness="1" HorizontalAlignment="Center" VerticalAlignment="Center">
            <TextBlock FontFamily="Snap ITC" FontSize="92pt" FontWeight="Bold" FontStyle="Italic">21</TextBlock>
        </Border>
    </Grid>
</Window>

получаем

Как получить действительные границы текста? Нужен Border в который текст вписывается.
Re: WPF: узнать реальные границы текста
От: Qulac Россия  
Дата: 13.06.16 16:31
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Я думал такие приколы сгинули в кану вместе с GDI+, ан нет и тут они нас догоняют.

HD>Имеем
HD>
HD><Window x:Class="WpfApplication1.MainWindow"
HD>        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
HD>        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
HD>        Title="MainWindow" Height="350" Width="525">
HD>    <Grid>
HD>        <Border BorderBrush="red" BorderThickness="1" HorizontalAlignment="Center" VerticalAlignment="Center">
HD>            <TextBlock FontFamily="Snap ITC" FontSize="92pt" FontWeight="Bold" FontStyle="Italic">21</TextBlock>
HD>        </Border>
HD>    </Grid>
HD></Window>
HD>

HD>получаем
HD>Image: WPF_textblock_bounds.png
HD>Как получить действительные границы текста? Нужен Border в который текст вписывается.

Видно дизайн у шрифта такой, отрезать выпирающие можно так: ClipToBounds="True"
Программа – это мысли спрессованные в код
Re[2]: WPF: узнать реальные границы текста
От: HotDog Швейцария www.denebspace.com
Дата: 14.06.16 06:47
Оценка:
Здравствуйте, Qulac, Вы писали:

Q>Видно дизайн у шрифта такой, отрезать выпирающие можно так: ClipToBounds="True"


В том то и дело, что мне нужно не отрезать, а показать весь текст без "обрезания".


Вообще пипец конечно, на дворе 2016 год, майкрософт со своим фонтом, на своей ОС, со своим самым последним, современным фреймворком не в состоянии отрендерить букву без ошибок.
Re[3]: WPF: узнать реальные границы текста
От: MxMsk Португалия  
Дата: 14.06.16 07:31
Оценка: 6 (1)
Здравствуйте, HotDog, Вы писали:

HD>Вообще пипец конечно, на дворе 2016 год, майкрософт со своим фонтом, на своей ОС, со своим самым последним, современным фреймворком не в состоянии отрендерить букву без ошибок.

Да. Скорее всего единственным подходящим и относительно простым вариантом будет ориентироваться на геометрию текста. К сожалению, это не сделать автоматом в XAML и достаточно медленно, если текста будет много.
Можно спуститься на уровень GlyphRun и GlyphTypeface, там больше возможностей, и есть такие штуки как AdvanceWidths и Left/RightSideBearings.

P.S. Отправил тебе кое-чего через личку, но пришло уведомление, что письмо не доставлено. Если не трудно, стукни в email из моего профиля — вопрос есть.
Re: WPF: узнать реальные границы текста
От: Sinatr Германия  
Дата: 14.06.16 07:42
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Как получить действительные границы текста? Нужен Border в который текст вписывается.


Если честно, то я проблем не вижу вообще. Добавьте Margin для TextBlock (c запасом).

А чтобы точно "вписать" текст (если вы какой-то редактор делаете очень точный) см. это и вот это.
---
ПроГLамеры объединяйтесь..
Re[2]: WPF: узнать реальные границы текста
От: HotDog Швейцария www.denebspace.com
Дата: 14.06.16 07:54
Оценка:
Здравствуйте, Sinatr, Вы писали:

S>Если честно, то я проблем не вижу вообще. Добавьте Margin для TextBlock (c запасом).


Пример с TextBlock это самый простой пример продемонстрировать проблему.
На самом деле есть RichTextBox, куда пользователь может вбить любой шрифт с любым размером.
И просто вот так добавить Margin с запасом не получится

S>А чтобы точно "вписать" текст (если вы какой-то редактор делаете очень точный) см. это и вот это.


Задача стоит обратная. Мне нужно гарантированно показать весь текст без его деформации.
Re[3]: WPF: узнать реальные границы текста
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 14.06.16 08:04
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Задача стоит обратная. Мне нужно гарантированно показать весь текст без его деформации.


Всё просто же: нарисовать текст в невидимый буфер, по пикселям найти границы, вывести.
Ce n'est que pour vous dire ce que je vous dis.
Отредактировано 14.06.2016 8:07 Don Reba . Предыдущая версия .
Re[3]: WPF: узнать реальные границы текста
От: Vladek Россия Github
Дата: 14.06.16 08:07
Оценка: 6 (1)
Здравствуйте, HotDog, Вы писали:

HD>В том то и дело, что мне нужно не отрезать, а показать весь текст без "обрезания".


Поставь какой-нибудь Margin или используй другие средства для работы с текстом, например: https://msdn.microsoft.com/en-us/library/system.windows.media.formattedtext.aspx Вообще у них целый блог есть: https://blogs.msdn.microsoft.com/text

HD>Вообще пипец конечно, на дворе 2016 год, майкрософт со своим фонтом, на своей ОС, со своим самым последним, современным фреймворком не в состоянии отрендерить букву без ошибок.

Ужос.
Re[4]: WPF: узнать реальные границы текста
От: HotDog Швейцария www.denebspace.com
Дата: 14.06.16 08:16
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Всё просто же: нарисовать текст в невидимый буфер, по пикселям найти границы, вывести.


Ага, именно так я и делал на GDI+, но это ж костыль!
Если бы под MacOC не было нормального способа вывести весь текст, то Стив Джобс к стенке наверное поставил
Re[4]: WPF: узнать реальные границы текста
От: HotDog Швейцария www.denebspace.com
Дата: 14.06.16 08:19
Оценка:
Здравствуйте, Vladek, Вы писали:

V>Поставь какой-нибудь Margin или используй другие средства для работы с текстом, например: https://msdn.microsoft.com/en-us/library/system.windows.media.formattedtext.aspx Вообще у них целый блог есть: https://blogs.msdn.microsoft.com/text


Скопирую сюда из другого ответа
"Пример с TextBlock это самый простой пример продемонстрировать проблему.
На самом деле есть RichTextBox, куда пользователь может вбить любой шрифт с любым размером.
И просто вот так добавить Margin с запасом не получится"

Что толку с блога который уже 6 лет как мертв?

V>Ужос.

Конечно ужос. Или желаение вывести текст без ошибок это что то нереально оторванное от жизни?
Re[5]: WPF: узнать реальные границы текста
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 14.06.16 08:24
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Ага, именно так я и делал на GDI+, но это ж костыль!

HD>Если бы под MacOC не было нормального способа вывести весь текст, то Стив Джобс к стенке наверное поставил

А как это делается на МакОС? Попиксельные границы же не узнать, пока не интерполируешь кубические кривые с нужным разрешением и с учётом хинтинга и сглаживания.
Ce n'est que pour vous dire ce que je vous dis.
Отредактировано 14.06.2016 8:34 Don Reba . Предыдущая версия . Еще …
Отредактировано 14.06.2016 8:33 Don Reba . Предыдущая версия .
Отредактировано 14.06.2016 8:32 Don Reba . Предыдущая версия .
Re[5]: WPF: узнать реальные границы текста
От: Vladek Россия Github
Дата: 14.06.16 08:54
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Что толку с блога который уже 6 лет как мертв?


Толк в актуальности информации, которая там представлена, а не в свежести постов.

V>>Ужос.

HD>Конечно ужос. Или желаение вывести текст без ошибок это что то нереально оторванное от жизни?

Каких ошибок? Тебе надо вычислить left/right side bearings — средства для этого есть, вычисляй. В сети есть примеры кода, как это сделать: http://stackoverflow.com/questions/9264398/how-to-calculate-wpf-textblock-width-for-its-known-font-size-and-characters Задача TextBlock — относительно быстро нарисовать текст без лишней работы.

Да, придётся писать код.
Re[6]: WPF: узнать реальные границы текста
От: HotDog Швейцария www.denebspace.com
Дата: 14.06.16 09:13
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>А как это делается на МакОС? Попиксельные границы же не узнать, пока не интерполируешь кубические кривые с нужным разрешением и с учётом хинтинга и сглаживания.


MS же вычисляет попиксельные границы для regular шрифта, но на жирном и курсивном фонте лажает.
Re[6]: WPF: узнать реальные границы текста
От: HotDog Швейцария www.denebspace.com
Дата: 14.06.16 10:00
Оценка:
Здравствуйте, Vladek, Вы писали:

V>Каких ошибок? Тебе надо вычислить left/right side bearings — средства для этого есть, вычисляй. В сети есть примеры кода, как это сделать: http://stackoverflow.com/questions/9264398/how-to-calculate-wpf-textblock-width-for-its-known-font-size-and-characters Задача TextBlock — относительно быстро нарисовать текст без лишней работы.


V>Да, придётся писать код.


Есть идеи как посчитать left/right side bearings для richtextbox в котором богато форматированный текст? С таблицами, с изображениями, текст разных размеров шрифтов и стилей?
Re[7]: WPF: узнать реальные границы текста
От: MxMsk Португалия  
Дата: 14.06.16 10:20
Оценка:
Здравствуйте, HotDog, Вы писали:

HD>Есть идеи как посчитать left/right side bearings для richtextbox в котором богато форматированный текст? С таблицами, с изображениями, текст разных размеров шрифтов и стилей?

В такой задаче действительно лучше пойти по пути достаточных Margin, чем делать auto-size. Мало того, что трудно нормальный layout обсчитать, так и сама эта операция — дорогая, медленная. Мы даже кеш глифов заводили для подобных штук, хотя у нас не Rich, а просто много текста в разных местах сцена. Заложи по-приличнее или, скажем, вычисляй Margin относительно размера шрифта.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.