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&#160;Together(en)&#160;bla5 bla6 longWordWhichShouldBreak
            </TextBlock>
            <TextBlock TextWrapping="WrapWithOverflow" Foreground="DarkRed">
                bla1 bla2 bla3 bla4&#160;Together(en)&#160;bla5 bla6 longWordWhichShouldBreak
            </TextBlock>
        </StackPanel>

Результат

4 ответа

Используйте NO-BREAK SPACE в вашем динамическом тексте. Например:

<TextBlock TextWrapping="Wrap">
        Example text with wrap and example text&#160;without&#160;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

Другие вопросы по тегам