TextBlock TextWrapping Wrap и NoWrap объединяются и Text через DynamicResource
У меня есть несколько TextBlocks, чей текст вставляется через DynamicResource. Все они установлены в TextWrapping="Wrap". Но внутри этих текстовых строк у меня есть слова, которые нельзя разделять. Эти слова должны быть сохранены как целое слово.
С жестко закодированным текстом в Xaml это довольно легко решить с помощью TextBlock внутри Textblock:
<TextBlock TextWrapping="Wrap">
Example text with wrap and <TextBlock TextWrapping="NoWrap" Text=" example text without wrap"/
</TextBlock>
Но это решение не работает, когда Text the вставляется через DynamicResource, потому что текст не анализируется.
Как я могу объединить nowrap и wrap внутри текста DynamicResource, не разбивая его на несколько TextBlocks один за другим?
PS: я сейчас создал пример, чтобы продемонстрировать поведение, которое я хотел бы (зеленый) и неудачные попытки (красный, оранжевый, затемненный) его решения:
<StackPanel HorizontalAlignment="Center" Width="80" Orientation="Vertical">
<TextBlock TextWrapping="Wrap" Foreground="green">
bla1 bla2 bla3 bla4 <TextBlock TextWrapping="NoWrap" Text="Together(en)"/> bla5 bla6 longWordWhichShouldBreak
</TextBlock>
<TextBlock TextWrapping="Wrap" Foreground="red">
bla1 bla2 bla3 bla4 Together(en) bla5 bla6 longWordWhichShouldBreak
</TextBlock>
<TextBlock TextWrapping="Wrap" Foreground="orange">
bla1 bla2 bla3 bla4 Together(en) bla5 bla6 longWordWhichShouldBreak
</TextBlock>
<TextBlock TextWrapping="WrapWithOverflow" Foreground="DarkRed">
bla1 bla2 bla3 bla4 Together(en) bla5 bla6 longWordWhichShouldBreak
</TextBlock>
</StackPanel>
4 ответа
Используйте NO-BREAK SPACE в вашем динамическом тексте. Например:
<TextBlock TextWrapping="Wrap">
Example text with wrap and example text without wrap
</TextBlock>
Вы можете заменить пробел этим символом в тех частях, которые вам нужны:
Replace(" ", System.Convert.ToChar(160))
Рассматривали ли вы использованиеWrapWithOverflow
' вместо 'Wrap
"? Это только разорвет линию, если появится пробел.
Затем вы можете установить слова, которые должны появляться вместе с черточками, например, "обычная строка и слова, которые не должны ломаться"
Вы должны использовать Run:
<TextBlock>
<Run Text={x:static SomeText} />
<Run Text={x:static SomeNoWrapText}
TextWrapping="NoWrap"/>
<Run Text={x:static SomeMoreText} />
</TextBlock>
Это немного для комментария, но и не полный ответ.
Давайте переведем ваш пример XAML из всего неявного содержимого в полную структуру.
Ваш упрощенный XAML с использованием неявных свойств содержимого и т. Д.
<TextBlock TextWrapping="Wrap" Foreground="green">
bla1 bla2 bla3 bla4 <TextBlock TextWrapping="NoWrap" Text="Together(en)"/> bla5 bla6 longWordWhichShouldBreak
</TextBlock>
Эквивалентная фактическая структура:
<TextBlock TextWrapping="Wrap" Foreground="green">
<TextBlock.Inlines>
<Run Text="bla1 bla2 bla3 bla4 "/>
<InlineUIContainer>
<InlineUIContainer.Child>
<TextBlock TextWrapping="NoWrap" Text="Together(en)"/>
</InlineUIContainer.Child>
</InlineUIContainer>
<Run Text=" bla5 bla6 longWordWhichShouldBreak"/>
</TextBlock.Inlines>
</TextBlock>
Это должно дать вам представление о сложности того, что у вас есть в вашем XAML. Вы не можете получить тот же результат, просто установив Text
имущество.
В настоящее время я не могу ответить, как решить эту проблему, так как DynamicResource
недостаточно информации, чтобы начать трансформироваться в вышеприведенную структуру.
Вы можете взглянуть на этот вопрос: привязка данных к TextBlock.Inlines