3

我有多个 TextBlocks,其文本是通过 DynamicResource 插入的。它们都设置为 TextWrapping="Wrap"。但是在这些文本字符串中,我有不允许拆分的单词。这些词必须作为一个完整的词保留。

使用 Xaml 中的硬编码文本,通过 Textblock 内的 TextBlock 很容易解决:

<TextBlock TextWrapping="Wrap">
Example text with wrap and <TextBlock TextWrapping="NoWrap" Text=" example text without wrap"/
</TextBlock>

但是,当通过 DynamicResource 插入 Text 时,此解决方案不起作用,因为没有解析文本。

如何将 nowrap 和 wrap 组合在 DynamicResource Text 中而不将其一个接一个地拆分为多个 TextBlock?

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

4 回答 4

2

在动态文本中使用NO-BREAK SPACE 。例如:

<TextBlock TextWrapping="Wrap">
        Example text with wrap and example text&#160;without&#160;wrap
</TextBlock>

您可以在需要此行为的部分中用此字符替换空格:

  Replace(" ", System.Convert.ToChar(160))
于 2017-02-27T12:25:45.600 回答
1

您是否考虑过使用 ' WrapWithOverflow' 而不是 ' Wrap'?这只会在出现空格时换行。

然后,您可以设置必须与破折号一起出现的单词,例如 - '常规行和不应该中断的单词'

于 2017-02-27T12:27:14.377 回答
0

你应该使用运行:

<TextBlock>
    <Run Text={x:static SomeText} />
    <Run Text={x:static SomeNoWrapText}
         TextWrapping="NoWrap"/>
    <Run Text={x:static SomeMoreText} />
</TextBlock>
于 2017-02-27T12:35:21.117 回答
0

评论有点多,但也不是完整的答案。

让我们将您的 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没有足够的信息开始转换为上述结构。

您可能想看看这个问题:Data binding the TextBlock.Inlines

于 2017-02-28T13:11:53.567 回答