WPF TextBlock与<LineBreak />绑定

cod*_*rix 2 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>
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&#x0d;&#x0a;Line 2"/>
Run Code Online (Sandbox Code Playgroud)

但是,如果你这样做,这将无法奏效:

<TextBlock>
   <TextBlock.Text>
      Line 1&#x0d;&#x0a;Line 2
   </TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

因为XML解析器规范化元素内容中的空白.那个CR/LF对变成了一个单独的空间,这就是进入text属性的东西.

如果您正在使用绑定,则无需担心任何此类XML内容(除非您绑定到XML文档的内容!).你可以\r\n加入物业价值.

其他的方式做,这是直接填充TextBlockInlines属性.但是你不能通过绑定来做到这一点,因为Inlines它不是依赖属性 - 事实上,它是只读的,你只能通过调用它AddAddRange方法来填充它.


Mau*_*lli 5

我用这段代码来获得你想要的。这是 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)

  • 我们真的生活在一个还需要回车的时代吗?为什么不能只是一个简单的 '\n' 转义序列。我的键盘不再有回车电枢,它不再发出叮当声。 (4认同)