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

时间:2011-12-15 19:16:48

标签: c# wpf newline textblock

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

我试过了:

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

但数据仍然显示没有新行。我通过C#。

通过<data>属性设置.Text的内容

我需要在XML中添加什么才能在GUI中呈现新行?

我尝试过这样的手动设置XAML中的文本:

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

虽然编码字符没有出现在GUI中,但它也没有给我一个新的行。

11 个答案:

答案 0 :(得分:156)

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

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

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

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

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

答案 1 :(得分:49)

为了完整性:您也可以这样做:

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

答案 2 :(得分:19)

您也可以使用绑定

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

并将MyText设置为:

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

答案 3 :(得分: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>

注意:如果你们都使用&amp; 10并且你转到文本的下一行,那么你将有两行空行。

这里有详细信息: http://msdn.microsoft.com/en-us/library/ms788746.aspx

答案 4 :(得分:11)

即使这是一个老问题,我也只是遇到了问题并且从给定的答案中解决了它。也许它对其他人有帮助。

我注意到即使我的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();
    }
}

答案 5 :(得分:9)

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

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

答案 6 :(得分: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>

答案 7 :(得分:1)

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

答案 8 :(得分:0)

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

AcceptsReturn="True"

答案 9 :(得分: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)应该放在“换行和换行”的位置,这是我成功完成的目的。

答案 10 :(得分:0)

        StringBuilder somestext = new StringBuilder();
        somestext.AppendLine("this is some text on line 1");
        somestext.AppendLine(TB_Tag_Linebreak);
        somestext.AppendLine("this is some more text on line 2"); 
        return somestext.ToString();