C# TextBlock Text wrapp Wrap和NoWrap通过DynamicResource组合和文本
我有多个文本块,其文本通过DynamicSource插入。它们都设置为text wrapping=“Wrap”。但在这些文本字符串中,我有不允许拆分的单词。这些话必须作为一个整体来保留 使用Xaml中的硬编码文本,通过TextBlock中的TextBlock很容易解决:C# TextBlock Text wrapp Wrap和NoWrap通过DynamicResource组合和文本,c#,wpf,xaml,word-wrap,dynamicresource,C#,Wpf,Xaml,Word Wrap,Dynamicresource,我有多个文本块,其文本通过DynamicSource插入。它们都设置为text wrapping=“Wrap”。但在这些文本字符串中,我有不允许拆分的单词。这些话必须作为一个整体来保留 使用Xaml中的硬编码文本,通过TextBlock中的TextBlock很容易解决: <TextBlock TextWrapping="Wrap"> Example text with wrap and <TextBlock TextWrapping="NoWrap" Text=" exampl
<TextBlock TextWrapping="Wrap">
Example text with wrap and <TextBlock TextWrapping="NoWrap" Text=" example text without wrap"/
</TextBlock>
在动态文本中使用带换行和的示例文本。例如:
<TextBlock TextWrapping="Wrap">
Example text with wrap and example text without wrap
</TextBlock>
您是否考虑过使用“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>
bla1bla2bla3bla4bla5bla6bla6longwordwhichshouldbreak
等效实际结构:
<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
没有足够的信息开始转换为上述结构
您可能想看看这个问题:谢谢。没有休息空间将是一个很好的解决方案。不幸的是,它不起作用:这就是TextWrapping=“Wrap”
的工作方式。即使你使用了一个长单词,它也会打断它,以便在可用空间中进行包装。使用TextWrapping=“WrapWithOverflow”
,其结果类似于在TextBlock
中使用TextBlock
(即问题中的示例)。使用run与在TextBlock中使用TextBlock具有相同的效果。它直接在XAML代码中工作,但在通过dynamic ressource插入时不工作。谢谢!是的,我也试过WrapWithOverflow。此设置的问题是文本部分突出,因此不可见(被截断)。听起来您所谓的“DynamicSource”的结构不适合在WPF中使用。如何对一系列文本块进行预处理,其中每个文本块都有其显示选项?是的,在nowrap和wrap片段中对多个文本序列进行预处理是一种解决方案。但是它相对来说比较昂贵。我认为在wrap textblock中只保留一个单词是一个更好的解决方案。通常,使用textblock.Inlines
属性可能比使用textblock.Text
属性运气更好。你不能指望Text
属性除了把你的文本当作。。。好的,谢谢你的内联提示!但是内联线是不可绑定的,我认为不能注入动态资源。嗯,令人惊讶。。。但关键是,当您编写
时,您使用的是文本
,但当您编写X
时,使用的是TextBlock.Inlines
集合,而不是Text
属性。因此,不要希望在不使用内联线的情况下模仿您编写的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>