Как вставить новую строку в элемент управления WPF TextBlock?

103

Я беру текст из файла 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>

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

Здесь только боливийский
источник
пробовали ли вы заключить символ возврата в "кавычки" <data> Foo bar baz "\ n" baz bar </data>
MethodMan
@DJKRAZE: Цитаты ничего не делают, равно как и r и n вместе. : S
Здесь только боливиец
@BalamBalam: Это не одно и то же, вопрос в явном отношении к текстовому атрибуту.
HB
Вижу, я полностью понимаю, почему "" не сработает сейчас ... Я предполагаю, что <LineBreak> тогда больше походил бы на буквальное / ключевое слово. моя ошибка .. Отличный ответ HB
MethodMan
Дэн Фогель разработал современное рабочее решение. WPF интерпретирует \ r \ n в \\ r \\ n.
zORg Alex

Ответы:

176

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

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

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

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

<TextBlock>
    Lorem <LineBreak/>
    Ipsum
</TextBlock>
HB
источник
Нет, это тоже ничего не значит. Я даже скопировал вставленное содержимое в XAML TextBlock с нажатиями ввода в виде новых строк, и он все равно отображает его сразу.
Здесь только боливиец
3
@SergioTapia: существует разница между наличием разрыва в каком-либо файле данных и XAML, синтаксический анализатор XAML игнорирует пробелы, но если вы, например, десериализуете некоторый XML, используя XmlSerializerразрывы, будут сохранены. В Xaml вам понадобится <LineBreak/>.
HB
Поместите новую строку прямо в данные ... конечно же! Здесь я просто потратил много времени, пытаясь \ n, <LineBreak /> и тонны HTML-кода, но безрезультатно. Я должен был сначала попробовать самый простой подход.
thehelix
66

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

 <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
Вам даже не нужна строка.Format (). вернуть "Мой текст \ n Ваш текст"; работает нормально.
Zodman 04
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/en-us/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();
    }
}
Дэн Фогель
источник
Наряду с необходимостью добавления TextWrapping="Wrap"AcceptsReturn="True"если бы это был TextBox) в XAML на TextBlock, вы все сделали правильно, и это должен быть ответ, но просто скажите, чтобы сделать .Replace()значение, поступающее из базы данных - нет необходимости в причудливая функция: valueAsString = valueAsString.Replace("\\r\\n", "\r\n"); любое значение, введенное с помощью клавиши Return, будет записано в БД нормально - это когда C # захватит его, чтобы отобразить значение, вызывающее проблемы, как вы заметили. Так что это нужно было бы назвать загрузкой текста.
vapcguy 03
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 в текстовом поле.

Заказать23
источник
0

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

AcceptsReturn="True"
Дэйв
источник
AcceptsReturn предназначен только для TextBox, а не для TextBlock
Стив
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), где должны идти строки и разрывы, что я успешно сделал для своих целей.

Джош
источник