Как вставить новую строку в элемент управления 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>

Нет, это тоже ничего не значит. Я даже скопировал вставленное содержимое в 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 в текстовом поле.


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), где должны идти строки и разрывы, что я успешно сделал для своих целей.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.