WPF文本块与<;LineBreak/>;
我的ControlTemplate中有一个TextBlock绑定,如下所示WPF文本块与<;LineBreak/>;,wpf,wpf-controls,Wpf,Wpf Controls,我的ControlTemplate中有一个TextBlock绑定,如下所示 <TextBlock Grid.Column="1" VerticalAlignment="Center" FontSize="16" FontFamily="Arial" FontWeight="Bold" Text="{Binding RelativeSource={RelativeSource TemplatedParent},Path=ButtonText}"> </TextBlock>
<TextBlock Grid.Column="1" VerticalAlignment="Center"
FontSize="16" FontFamily="Arial" FontWeight="Bold"
Text="{Binding RelativeSource={RelativeSource TemplatedParent},Path=ButtonText}">
</TextBlock>
当我将ButtonText设置为如下时,它不起作用。它不会显示在单独的行中
ButtonText="Change<LineBreak/> Casette"
ButtonText=“更改案例”
如何解决这个问题?感谢您的帮助,请提供示例代码。我使用此代码获得您想要的。这是XAML:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="1" VerticalAlignment="Center"
FontSize="16" FontFamily="Arial" FontWeight="Bold"
Text="{Binding Path=ButtonText}">
</TextBlock>
</Grid>
TextBlock
显示其内联线
属性的内容。Text
属性的存在只是为了方便(尽管它很重要):如果设置Text
属性,TextBlock
将创建一个Run
,将其内容设置为您提供的字符串,并将其保存在Inlines
集合中
在XAML中设置TextBlock
元素的内容时,XamlReader
直接填充Inlines
集合,而不是通过Text
属性。它将文本节点解析为Run
对象,并像XAML一样解析元素。因此:
<TextBlock>
Line1<LineBreak/>Line2
</TextBlock>
您将得到一个异常,因为XamlReader
将尝试创建LineBreak
对象,而Text
属性只能包含一个字符串
您的绑定没有按您希望的方式工作,因为它显式地将Text
属性设置为字符串。这不会被解析为XAML(这也是一件好事)。因此,TextBlock
中显示的是该字符串的内容
所以基本上有两种方法来完成你想要完成的事情。在您的例子中,您可能只需要在字符串中嵌入一个换行符就可以了
但是,如果您是从XAML进行的,那么这比看起来要复杂得多。因为XAML是XML,XML对空格做了一些有趣的事情。如果使用XML字符实体在属性中显式设置它,则可以,例如:
<TextBlock Text="Line 1
Line 2"/>
但如果你这样做,那就行不通了:
<TextBlock>
<TextBlock.Text>
Line 1
Line 2
</TextBlock.Text>
</TextBlock>
第1行和第x0d行
;第2行
因为XML解析器规范化了元素内容中的空白。CR/LF对被转换成一个空格,这就是进入文本属性的原因
如果您使用的是绑定,就不需要担心这些XML内容(除非您绑定到XML文档的内容!)。您只需将\r\n
放入属性值即可
另一种方法是直接填充
TextBlock
的内联线
属性。但是您不能通过绑定来实现这一点,因为Inlines
不是依赖属性-事实上,它是只读的,您只能通过调用其Add
或AddRange
方法来填充它。谢谢您的回复,我正在从XAML更改它。为什么它不能从XAML工作?应该从代码隐藏中完成吗?使用以下字符串:“Change
;
;Casette”我们真的生活在一个仍然需要回车的时代吗?为什么不能只是一个简单的“\n”转义序列呢。我的键盘不再有回车电枢,也不再发出叮当声。
<TextBlock>
<TextBlock.Text>
Line1<LineBreak/>Line2
</TextBlock.Text>
</TextBlock>
<TextBlock Text="Line 1
Line 2"/>
<TextBlock>
<TextBlock.Text>
Line 1
Line 2
</TextBlock.Text>
</TextBlock>