Як розмістити новий рядок у керуванні текстовим блоком wpf?


102

Я виймаю текст з 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>

І хоча кодований символ не відображається в графічному інтерфейсі, він також не дає мені нового рядка.


ви спробували обернути символ повернення в "quotes" <data> Foo bar baz "\ n" baz bar </data>
MethodMan

@DJKRAZE: Котирування нічого не роблять, а також не r і n разом. : S
Лише болівійська тут

@BalamBalam: Це не те саме, що питання полягає у чіткості щодо атрибута Text.
НВ

Я бачу, я повністю розумію, чому "" не працюватиме зараз. Я припускаю, що <LineBreak> буде більше схожим на буквальне / ключове слово. моя помилка .. Чудова відповідь HB
MethodMan

Ден Вогель зробив сучасне робоче рішення. WPF інтерпретує \ r \ n в \\ r \\ n.
zORg Олексій

Відповіді:


174

Ви можете спробувати ввести новий рядок у дані:

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

Якщо це не працює, можливо, вам доведеться розібрати рядок вручну.

Якщо вам потрібен прямий XAML, це до речі просто:

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

Ні, це теж нічого не робить. Я навіть копіював вкладений вміст всередині XAML TextBlock із введенням преси як нові рядки, і він все одно відображає його одразу.
Тільки болівійський тут

3
@SergioTapia: Існує різниця між перервою в якомусь файлі даних і XAML, аналізатор XAML ігнорує пробіли, але якщо ви, наприклад, десеріалізуєте деякий XML за XmlSerializerдопомогою перерв, буде збережено. У Xaml вам потрібно <LineBreak/>.
НВ

Покладіть новий рядок прямо в дані ... звичайно! Тут я просто провів багато часу, намагаючись \ n, <LineBreak /> і тонни html-кодів безрезультатно. Я мав би спершу спробувати найпростіший підхід.
thehelix

65

Для повноти: Ви також можете зробити це:

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

x0A - це шістнадцятковий канал, що уникнув. Еквівалент \ n


2
Корисно для прив'язки в такому сценарії: - <TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} Ім'я: {0} & # x0a; Код: {1}"> <Прив'язуючий шлях = "Ім'я" / > <Binding Path = "Код" /> </MultiBinding> </TextBlock.Text> </TextBlock>
rajibdotnet

3
це найкраща відповідь
Ауреліо Антоніо

Я додав би це посилання: stackoverflow.com/questions/9021649/… пояснення до відповіді.
І.Степ

22

Ви також можете використовувати зв'язування

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

І встановіть MyText так:

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

9
Вам навіть не потрібна string.Format (). повернути "Мій текст \ n Ваш текст"; працює просто чудово.
Зодман

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 AND ви переходите до наступного рядка у вашому тексті, у вас буде ДВА порожніх рядка.

тут для детальної інформації: 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

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

Вставте "розрив рядка" або "перерив абзацу" в "rtb" RichTextBox таким чином:

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), куди повинні йти лінії та розриви, що я успішно зробив для своїх цілей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.