2017-02-27 28 views
3

我有多个TextBlocks,其文本通过DynamicResource插入。它们都设置为TextWrapping =“Wrap”。但是在这些文本字符串中,我有不允许被分割的单词。这些词语必须作为一个整体词汇。TextBlock TextWrapping将Wrap和NoWrap合并在一起并通过DynamicResource显示文字

随着XAML中硬编码的文本这是很容易通过一个TextBlock解决的文本块中:

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

但是,当文本的通过DynamicResource插入,因为文字是没有得到解析这个解决方案是行不通的。

如何将NOWrap和包装在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> 

Result

+1

听起来像你的所谓的“DynamicResource”是不适合的结构在WPF使用。如何预处理一系列文本块,其中每个块都有其显示选项? – grek40

+0

是预处理成多个文本序列,在nowrap和包装件中是一种解决方案。但它相对昂贵。我认为有一个更好的解决方案,只是在包装文本块中只保留一个单词。 – CR500

+0

通常,您可能比TextBlock.Text属性拥有更好的TextBlock.Inlines属性。你不能指望'Text'属性做任何事情,而不仅仅是把你的文本当作......好文本。 – grek40

回答

1

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

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

你可以用这个字符是在那些需要这种行为的部分替代空间:

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

谢谢。不间断的空间将是一个很好的解决方案。不幸的是,它不起作用: [不间断空间xaml和窗口的屏幕截图](http://666kb.com/i/dh38s0g1zt1hss3k8.png) – CR500

+0

这是“TextWrapping =”Wrap“ '。即使你使用了一个长词,它也会打破它,以便将它包装在可用空间中。使用''TextWrapping =“WrapWithOverflow”'',结果与在''TextBlock''内使用''TextBlock'“类似(即问题中的例子)。 – Ron

0

你有没有考虑使用“WrapWithOverflow”而不是“Wrap”? 这只会在出现空格时破坏行。

然后,您可以设置必须与破折号一起出现的话,EG- “定期航线和单词,这-shouldn't断”

+0

谢谢!是的,我也尝试过WrapWithOverflow。这个设置的问题是文本部分突出,因此不可见(切断)。 – CR500

0

你应该使用运行:

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

使用运行与在文本块内使用文本块的效果相同。它直接在XAML代码中工作,但在通过动态资源插入时不起作用。 – CR500

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