Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF文本块与<;LineBreak/>;_Wpf_Wpf Controls - Fatal编程技术网

WPF文本块与<;LineBreak/>;

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>

我的ControlTemplate中有一个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&#x0d;&#x0a;Line 2"/>

但如果你这样做,那就行不通了:

<TextBlock>
   <TextBlock.Text>
      Line 1&#x0d;&#x0a;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&#x0d;&#x0a;Line 2"/>
<TextBlock>
   <TextBlock.Text>
      Line 1&#x0d;&#x0a;Line 2
   </TextBlock.Text>
</TextBlock>