我在ControlTemplate中有如下TextBlock绑定.
<TextBlock Grid.Column="1" VerticalAlignment="Center"
FontSize="16" FontFamily="Arial" FontWeight="Bold"
Text="{Binding RelativeSource={RelativeSource TemplatedParent},Path=ButtonText}">
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
当我按如下方式设置ButtonText时,它不起作用.它不会显示在单独的行中.
ButtonText="Change<LineBreak/> Casette"
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?感谢您的帮助,请提供示例代码.
Rob*_*ney 13
A TextBlock显示其Inlines属性的内容.该Text属性仅为方便而存在(尽管它是一个重要的):如果您设置Text属性,TextBlock将创建一个Run,将其内容设置为您提供的字符串,并将其保存在Inlines集合中.
TextBlock在XAML中设置元素的内容时,直接XamlReader填充Inlines集合而不是通过Text属性.它将文本节点解析为Run对象,并像往常一样将元素解析为XAML.所以这:
<TextBlock>
Line1<LineBreak/>Line2
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
被视为实际上是这样的:
<TextBlock>
<Run>Line1</Run>
<LineBreak/>
<Run>Line2</Run>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
顺便提一下,如果您尝试Text显式设置属性,请注意:
<TextBlock>
<TextBlock.Text>
Line1<LineBreak/>Line2
</TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
你会得到一个例外,因为它XamlReader会尝试创建一个LineBreak对象,而该Text属性只能包含一个字符串.
您的绑定没有按照您希望的方式工作,因为它明确地将Text属性设置为字符串.这不会被解析为XAML(也是好事).所以显示的TextBlock是该字符串的内容.
所以基本上有两种方法可以完成你想要完成的任务.在你的情况下,你可能只是在字符串中嵌入换行符.
但是如果你是从XAML那里做的话,这比看起来更棘手.因为XAML是XML,而XML对空白做了一些有趣的事情.如果使用XML字符实体在属性中显式设置它,则可以,例如:
<TextBlock Text="Line 1
Line 2"/>
Run Code Online (Sandbox Code Playgroud)
但是,如果你这样做,这将无法奏效:
<TextBlock>
<TextBlock.Text>
Line 1
Line 2
</TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
因为XML解析器规范化元素内容中的空白.那个CR/LF对变成了一个单独的空间,这就是进入text属性的东西.
如果您正在使用绑定,则无需担心任何此类XML内容(除非您绑定到XML文档的内容!).你可以\r\n加入物业价值.
在其他的方式做,这是直接填充TextBlock的Inlines属性.但是你不能通过绑定来做到这一点,因为Inlines它不是依赖属性 - 事实上,它是只读的,你只能通过调用它Add或AddRange方法来填充它.
我用这段代码来获得你想要的。这是 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>
Run Code Online (Sandbox Code Playgroud)
这是背后的代码。为了使示例更简单,我没有创建 ViewModel 类:
public Window1()
{
InitializeComponent();
DataContext = this;
ButtonText = "Change\r\nCasette";
}
public string ButtonText
{
get { return (string)GetValue(ButtonTextProperty); }
set { SetValue(ButtonTextProperty, value); }
}
// Using a DependencyProperty as the backing store for ButtonText. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ButtonTextProperty =
DependencyProperty.Register("ButtonText", typeof(string), typeof(Window1), new UIPropertyMetadata(""));
Run Code Online (Sandbox Code Playgroud)