Edit: я обнаружил в другом ответе, что TextBlock
также имеет коллекцию Inlines
, к которой можно добавить Run
s. Ответ Анваки изобретательно использует присоединенное свойство как своего рода конвертер.
Я думаю, что вам подойдет FlowDocumentScrollViewer
и FlowDocument
. Я описываю ручное создание одного через IValueConverter
немного здесь .
Скорее всего, вы будете использовать те же вспомогательные функции, что и в своем примере, но FlowDocument
уже очень похож на HTML и легко справится с переносом.
Вы добавляете Paragraph
s к FlowDocument
, вы добавляете Run
s к Paragraph
, и каждый Run
происходит от TextElement
, поэтому он имеет много тех же свойств, что TextBlock
с.
FlowDocument doc = new FlowDocument();
Paragraph par = new Paragraph();
doc.Blocks.Add( par );
Run r;
r = new Run( "This is " );
par.Inlines.Add( r );
r = new Run( "bold" );
r.FontWeight = FontWeights.Bold;
par.Inlines.Add( r );
r = new Run( " and this is " );
par.Inlines.Add( r );
r = new Run( "italic" );
r.FontStyle = FontStyles.Italic;
par.Inlines.Add( r );
r = new Run( " text." );
par.Inlines.Add( r );
Кроме того, если подстроки форматирования будут по-прежнему ограничены полужирным шрифтом / курсивом или какой-либо другой чрезвычайно простой разметкой, использование Regex.Split()
может быть самым простым способом определения отдельных Run
из одной строки. Позволяет разбить строку на несколько строк, но оставить «разделители».