TextBlock TextWrapping Wrap和NoWrap组合,Text通过DynamicResource组合

时间:2017-02-27 12:19:33

标签: c# wpf xaml textwrapping dynamicresource

我有多个TextBlocks,其Text通过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文本中,而不是一个接一个地将它拆分成多个TextBlock?

PS:我现在已经创建了一个示例来演示我想要的行为绿色)和失败的尝试(红色,橙色,黑暗)< / strong>解决它:

<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>

Result

4 个答案:

答案 0 :(得分:1)

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

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

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

  Replace(" ", System.Convert.ToChar(160))

答案 1 :(得分:0)

您是否考虑使用“WrapWithOverflow”代替“Wrap”? 如果出现空格,这只会破坏该行。

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

答案 2 :(得分:0)

您应该使用Run:

<TextBlock>
    <Run Text={x:static SomeText} />
    <Run Text={x:static SomeNoWrapText}
         TextWrapping="NoWrap"/>
    <Run Text={x:static SomeMoreText} />
</TextBlock>

答案 3 :(得分: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