Как поместить новую строку в элемент управления wpf TextBlock? - PullRequest
89 голосов
/ 15 декабря 2011

Я извлекаю текст из файла XML и хочу вставить несколько новых строк, которые интерпретируются текстовым блоком как новые строки.

Я пробовал:

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

Но данные по-прежнему отображаются без новой строки. Я устанавливаю содержимое <data> через свойство .Text через C #.

Что мне нужно поместить в XML, чтобы он отображал новую строку в графическом интерфейсе?

Я пробовал что-то вроде этого, вручную устанавливая текст в XAML:

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

И хотя закодированный символ не отображается в графическом интерфейсе, он также не дает мне новой строки.

Ответы [ 10 ]

157 голосов
/ 15 декабря 2011

Вы можете попробовать вставить новую строку в данные:

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

Если это не сработает, вам может понадобиться проанализировать строку вручную.

Если вам нужен прямой XAML, это легкокстати:

<TextBlock>
    Lorem <LineBreak/>
    Ipsum
</TextBlock>
49 голосов
/ 24 марта 2017

Для полноты: вы также можете сделать это:

 <TextBlock Text="Line1&#x0a;Line 2"/>
19 голосов
/ 31 августа 2012

Вы также можете использовать привязку

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

И установите MyText так:

Public string MyText
{
    get{return string.Format("My Text \n Your Text");}
}
18 голосов
/ 16 декабря 2011

вы должны использовать

 < 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/en-us/library/ms788746.aspx

11 голосов
/ 26 июня 2013

Несмотря на то, что это старый вопрос, я только столкнулся с проблемой и решил ее не так, как было дано.Может быть, это может быть полезно для других.

Я заметил, что, хотя мои 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();
    }
}
9 голосов
/ 13 июня 2013

Если ничего не помогает, вы также можете использовать

"My text needs a line break here" + System.Environment.NewLine + " This should be a new line"
8 голосов
/ 08 февраля 2015
<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 голос
/ 12 октября 2018

Использование System.Environment.NewLine - единственное решение, которое сработало для меня. Когда я попытался \ r \ n, он просто повторил фактическое \ r \ n в текстовом поле.

0 голосов
/ 07 июля 2019

Вставьте «разрыв строки» или «разрыв абзаца» в 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 преобразуются в \ строки, сохраняются по желанию и остаются правильными при повторном открытии файла * .Rtf.Это то, что я нашел до сих пор после тяжелых попыток.Мои три строки кода должны быть окружены большим количеством кода (с циклами), чтобы установить элементы TextPointer (.Start .End .ContentStart .ContentEnd), куда должны идти линии и разрывы, что я успешно сделал для своих целей.

0 голосов
/ 30 мая 2019

Вы должны убедиться, что для текстового блока включена эта опция:

AcceptsReturn="True"
...