Я не думаю, что вы можете перекрывать прогоны / пролеты, как это, вам придется найти все точки разрыва в вашем тексте и отформатировать каждый текстовый диапазон отдельно. Это похоже на HTML, где
<bold>some<italic> bold italic</bold> and other </italic> text.
недействительно. В вашем случае у вас будет жирный шрифт из (5,10), жирный шрифт из (11, 15) и т. Д.
Вероятно, полезно найти какой-нибудь класс Range
с методами для объединения диапазонов, разделения, поиска перекрытий и т. Д. Некоторое время назад я начал с this .
РЕДАКТИРОВАТЬ: У меня точно нет идеи, как реализовать все это (в прошлый раз я делал нечто подобное было почти 10 лет назад), но вы можете попробовать что-то вроде этого:
- Создать
List<Range<int>>
. Первоначально он содержит один диапазон (0, длина текста).
- Загрузить первый стиль, создать новый диапазон с начальным / конечным смещением. Перекрыть (или любой другой метод, который подходит) этот диапазон с диапазоном в списке. Это должно дать вам 3 диапазона, что-то вроде
(0, start of style), (start of style, end of style), (end of style, end of text)
. Удалить старый диапазон из списка и добавить новые.
- Загрузите следующее, найдите перекрытия с диапазонами в списке, удалите перекрывающиеся и добавьте новые диапазоны.
- Это должно дать вам список непересекающихся диапазонов.
- Теперь по стилям. Вы можете создать своего рода класс таблицы стилей. Этот класс может использовать
FontWeights, FontStyles
и другие перечисления, определенные в System.Windows
. Измените список так, чтобы он содержал, например, List<Tuple<int, Stylesheet>>
. Для вычисления перекрытий просто используйте первый параметр в кортеже.
- Прежде чем удалять старые диапазоны из списка, объедините стили.
- Это должно дать вам список не перекрывающихся областей с соответствующими стилями. Создать
TextRange
s, применить стили
Другая идея, которая может сработать:
- Снова создайте таблицу стилей. Изначально это должен быть нормальный вес, нормальный стиль, размер шрифта по умолчанию и т. Д.
- Найдите следующее смещение на входе (первое, которое больше текущего), создайте
TextRange
и примените стиль.
- Найти следующее смещение от входа, изменить текущий (и только) стиль и применить.
Если я правильно помню, вставка определения стиля в текст также считается как символы, поэтому вам может потребоваться скорректировать смещения при вставке тегов стиля в окончательный текст. Кроме того, я считаю, что это выполнимо просто с помощью TextBlock
.
Как я уже сказал, я не знаю, работает ли это так, как описано, но это может дать вам и идею.