Only Bolivian Here
Only Bolivian Here

Reputation: 36723

How to put a new line into a wpf TextBlock control?

I'm fetching text from an XML file, and I'd like to insert some new lines that are interpreted by the textblock render as new lines.

I've tried:

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

But the data is still displayed without the new line. I set the contents of <data> via the .Text property via C#.

What do I need to put in the XML in order for it to render the new line in the GUI?

I've tried something like this manually setting the text in the XAML:

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

And while the encoded character doesn't appear in the GUI it also doesn't give me a new line.

Upvotes: 135

Views: 197597

Answers (14)

Natxo
Natxo

Reputation: 2947

In case you are binding the content, this works very well:

<TextBlock>
   <Run Text="{Binding Text1}"/> <LineBreak/>
   <Run Text="{Binding Text2}"/> <LineBreak/>
   <Run Text="{Binding Text3}"/>
</TextBlock>

Upvotes: 0

luka
luka

Reputation: 637

just from the @Ketobomb suggestion, could you use this in your style:

 <Style x:Key="TextBlockTestStyle" TargetType="TextBlock">       
    <Setter Property="Text" Value="line1!&#x0a;Line2&#x0a;Line3"/>
 </Setter>

and use it in this way:

 <TextBlock x:Name="TextBlockTest" Style="{StaticResource TextBlockTestStyle}"/>

Upvotes: 2

addmoss
addmoss

Reputation: 692

Define a property which replaces \n with System.Environment.Newline on set:

private string _data;
public string Data
{
    get => _data; 
    set {
        _data = value.Replace("\\n", System.Environment.NewLine);
        OnPropertyChanged();
    }
}

Bind your textbox to the property:

<TextBox Text="{Binding Data}" />

Read the xml data and assign it to the property

Data = ...data fetched from xml...

Any \n in the xml data is displayed as a new line in the TextBox.

Upvotes: 0

jlazz
jlazz

Reputation: 1

        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();

Upvotes: 0

Christian Regli
Christian Regli

Reputation: 2246

For completeness: You can also do this:

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

x0A is the escaped hexadecimal Line Feed. The equivalent of \n

Upvotes: 115

Josh
Josh

Reputation: 79

Insert a "line break" or a "paragraph break" in a RichTextBox "rtb" like this:

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

The only way to get the NewLine items is by inserting text with "\r\n" items first, and then applying more code which works on Selection and/or TextRange objects. This makes sure that the \par items are converted to \line items, are saved as desired, and are still correct when reopening the *.Rtf file. That is what I found so far after hard tries. My three code lines need to be surrounded by more code (with loops) to set the TextPointer items (.Start .End .ContentStart .ContentEnd) where the Lines and Breaks should go, which I have done with success for my purposes.

Upvotes: 0

Dave
Dave

Reputation: 33

You have to ensure that the textblock has this option enabled:

AcceptsReturn="True"

Upvotes: -3

Order23
Order23

Reputation: 71

Using System.Environment.NewLine is the only solution that worked for me. When I tried \r\n, it just repeated the actual \r\n in the text box.

Upvotes: 2

alkk
alkk

Reputation: 331

<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>

Upvotes: 9

Dan Vogel
Dan Vogel

Reputation: 3938

Even though this is an old question, I've just come across the problem and solved it differently from the given answers. Maybe it could be helpful to others.

I noticed that even though my XML files looked like:

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

When it was read into my C# code the string had double backslashes.

\\r\\n

To fix this I wrote a ValueConverter to strip the extra backslash.

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();
    }
}

Upvotes: 13

Adrian
Adrian

Reputation: 3438

If all else fails you can also use

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

Upvotes: 10

Gordon
Gordon

Reputation: 1019

You can also use binding

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

And set MyText like this:

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

Upvotes: 26

GameAlchemist
GameAlchemist

Reputation: 19294

you must use

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

Or if you prefer :

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

watch out : if you both use &10 AND you go to the next line in your text, you'll have TWO empty lines.

here for details : http://msdn.microsoft.com/en-us/library/ms788746.aspx

Upvotes: 26

brunnerh
brunnerh

Reputation: 184296

You can try putting a new line in the data:

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

If that does not work you might need to parse the string manually.

If you need direct XAML that's easy by the way:

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

Upvotes: 228

Related Questions