如何将新行放入wpf TextBlock控件中?


101

我正在从XML文件中获取文本,我想插入一些由textblock渲染解释为新行的新行。

我试过了:

<data>Foo bar baz \n baz bar</data>

但是,数据仍然显示而没有换行。我通过C#<data>通过.Text属性设置了内容。

为了使它在GUI中呈现新行,我需要放入XML中的什么?

我已经尝试过在XAML中手动设置文本的方法:

<TextBlock Margin="0 15 0 0" Width="600">
There &#10;
is a new line.
</TextBlock>

而且虽然编码的字符没有出现在GUI中,但它也没有给我换行。


您是否尝试过将返回字符包装在“引号”中?<data> Foo bar baz“ \ n” baz bar </ data>
MethodMan 2011年

@DJKRAZE:引号什么也不做,r和n都不在一起。:S
只有玻利维亚人在这里

@BalamBalam:不一样,这个问题是关于Text属性的。
HB

我知道我完全理解为什么“”现在不起作用。我假设<LineBreak>会更像是文字/关键字。我的错误..很好的答案HB
MethodMan 2011年

Dan Vogel提出了最新的工作解决方案。WPF将\ r \ n解释为\\ r \\ n。
zORg Alex

Answers:


173

您可以尝试在数据中添加新行:

<data>Foo bar baz 
 baz bar</data>

如果这样不起作用,则可能需要手动解析字符串。

如果您需要直接XAML,那么很容易:

<TextBlock>
    Lorem <LineBreak/>
    Ipsum
</TextBlock>

不,这也无济于事。我什至已经复制了内容,并按Enter键将TextBlock的XAML内的内容作为新行粘贴,并且仍将其立即显示。
只有玻利维亚人在这里

3
@SergioTapia:在某些数据文件中有分隔符与XAML之间有区别,XAML解析器会忽略空格,但是例如,如果使用XmlSerializer分隔符反序列化某些XML ,则将保留。在Xaml中,您需要<LineBreak/>
HB

当然,将新行直接放入数据中!在这里,我只是花了很多时间尝试\ n,<LineBreak />和大量的html代码,但无济于事。我应该首先尝试最简单的方法。
thehelix

65

出于完整性考虑:您还可以执行以下操作:

 <TextBlock Text="Line1&#x0a;Line 2"/>

x0A是转义的十六进制换行符。等效于\ n


2
在这样的场景中进行绑定时很有用:-<TextBlock> <TextBlock.Text> <MultiBinding StringFormat =“ {} Name:{0}&#x0a; Code:{1}”> <Binding Path =“ Name” / > <Binding Path =“ Code” /> </ MultiBinding> </TextBlock.Text> </ TextBlock>
rajibdotnet

3
这是最好的答案
奥雷里奥安东尼

我将添加此链接:stackoverflow.com/questions/9021649/…答案的解释。
I.Step

22

您也可以使用绑定

<TextBlock Text="{Binding MyText}"/>

像这样设置MyText:

Public string MyText
{
    get{return string.Format("My Text \n Your Text");}
}

9
您甚至不需要string.Format()。返回“我的文字\ n您的文字”;效果很好。
Zodman

18

你必须使用

 < SomeObject xml:space="preserve" > once upon a time ...
      this line will be below the first one < /SomeObject>

或者,如果您喜欢:

 <SomeObject xml:space="preserve" />  once upon a time... &#10; this line below < / SomeObject>

注意:如果您都使用&10并转到文本的下一行,则将有两个空行。

此处了解详细信息:http : //msdn.microsoft.com/zh-cn/library/ms788746.aspx


12

即使这是一个古老的问题,我也遇到了这个问题,并以与给定的答案不同的方式解决了它。也许对其他人有帮助。

我注意到即使我的XML文件看起来像:

<tag>
 <subTag>content with newline.\r\nto display</subTag>
</tag>

当将其读入我的C#代码时,该字符串带有双反斜杠。

\\r\\n

为了解决这个问题,我编写了一个ValueConverter来去除多余的反斜杠。

public class XmlStringConverter : IValueConverter
{
    public object Convert(
        object value,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        string valueAsString = value as string;
        if (string.IsNullOrEmpty(valueAsString))
        {
            return value;
        }

        valueAsString = valueAsString.Replace("\\r\\n", "\r\n");
        return valueAsString;
    }

    public object ConvertBack(
        object value,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

除了必须在TextBlock上的XAML中添加TextWrapping="Wrap"AcceptsReturn="True"如果这是一个TextBox)之外,您已经正确了,这应该是答案-但只是说对.Replace()来自数据库的值进行处理-不需要精美的功能: valueAsString = valueAsString.Replace("\\r\\n", "\r\n"); 使用Return键输入的任何值都可以很好地写入数据库-正如您所指出的,这是C#保留它以显示引起问题的值的时候。因此,这将需要称为文本的onload。
vapcguy

10

如果其他所有方法都失败了,您也可以使用

"My text needs a line break here" + System.Environment.NewLine + " This should be a new line"

8
<TextBlock Margin="4" TextWrapping="Wrap" FontFamily="Verdana" FontSize="12">
        <Run TextDecorations="StrikeThrough"> Run cannot contain inline</Run>
        <Span FontSize="16"> Span can contain Run or Span or whatever 
            <LineBreak />
        <Bold FontSize="22" FontFamily="Times New Roman" >Bold can contains 
            <Italic>Italic</Italic></Bold></Span>
</TextBlock>

1

使用System.Environment.NewLine是唯一对我有用的解决方案。当我尝试\ r \ n时,它只是在文本框中重复了实际的\ r \ n。


0

您必须确保文本块启用了此选项:

AcceptsReturn="True"

AcceptsReturn仅适用于TextBox,而不适用于TextBlock
Steve

0

像这样在RichTextBox“ rtb”中插入“换行符”或“段落符”:

var range = new TextRange(rtb.SelectionStart, rtb.Selection.End); 
range.Start.Paragraph.ContentStart.InsertLineBreak();
range.Start.Paragraph.ContentStart.InsertParagraphBreak();

获取NewLine项的唯一方法是先插入带有“ \ r \ n”项的文本,然后再应用更多对Selection和/或TextRange对象有效的代码。这样可以确保将\ par项转换为\ line项,按需要保存,并且在重新打开* .Rtf文件时仍然正确。经过艰苦的努力,到目前为止,这是我发现的。我的三个代码行需要被更多的代码(带有循环)包围,以设置TextPointer项(.Start .End .ContentStart .ContentEnd)应该放在“换行和换行”的位置,为达到目的,我已经成功地做到了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.