Новая строка в строковом атрибуте


283

Как я могу добавить разрыв строки в текст, когда он задается как атрибут, т.е.

<TextBlock Text="Stuff on line1 \n Stuff on line2" />

Разбить его на разорванный формат не вариант для моей конкретной ситуации. Мне нужен какой-то способ подражать следующему:

<TextBlock>
  <TextBlock.Text>
    Stuff on line1 <LineBreak/>
    Stuff on line2
  </TextBlock.Text>
<TextBlock/>

Ответы:


553
<TextBlock Text="Stuff on line1&#x0a;Stuff on line 2"/>

Вы можете использовать любое шестнадцатеричное значение для представления литерала. В этом случае я использовал перевод строки (символ 10). Если вы хотите сделать «классический» vbCrLf, то вы можете использовать&#x0d;&#x0a;

Кстати, обратите внимание на синтаксис: это амперсанд, фунт, буква x , затем шестнадцатеричное значение нужного вам символа и, наконец, точка с запятой.

ТАКЖЕ: для полноты вы можете привязать к тексту, в котором уже есть встроенные переводы строк, как константу в вашем коде или переменную, созданную во время выполнения.


14
Очевидно, это не работает в тегах <TextBlock.Text> </ TextBlock.Text>.
tcables

45
На сегодняшний день у меня 34 ответа на этот ответ, и мне все еще приходилось возвращаться и проверять, потому что синтаксис настолько архаичен.
Боб Кинг

3
Абсолютно. У меня есть эта закладка. Я должен прийти, чтобы проверить это все время.
MojoFilter

4
'Archaic' ==> 'Arcane' :-)
Уилл Дин

5
Работает даже внутри параметра привязки при добавлении обратной косой черты, например: ConverterParameter = 'Test \ & # x0a; Text'
Sven,

72

Может быть, вы можете использовать атрибут xml: space = "preserve" для сохранения пробелов в исходном XAML

<TextBlock xml:space="preserve">
Stuff on line 1
Stuff on line 2
</TextBlock>

8
Вы также можете удалить xml: space = "preserve" и добавить <LineBreak /> между строк
полезноBee

5
Следует отметить (несколько лет спустя), что xml:space="preserve"также сохранятся отступы, которые обычно присутствуют в XAML. Таким образом, явное, <LineBreak />как предложено выше, кажется более чистым решением.
Зевс

Спасибо! Это решение очень хорошо вписалось в мой код сериализации на XAML.
Серафим

О, это сработало отлично. Это спасло меня так много кода котельной плиты. спасибо
iam.Carrot

57

Когда вам нужно сделать это в виде строки (например: в ваших ресурсах), вам нужно использовать xml:space="preserve" и коды символов амперсанда:

<System:String x:Key="TwoLiner" xml:space="preserve">First line&#10;Second line</System:String>

Или буквальные переводы строк в тексте:

<System:String x:Key="TwoLiner" xml:space="preserve">First line 
Second line</System:String>

Предупреждение: если вы пишете код, как во втором примере, вы вставляете либо новую строку, либо возврат каретки и новую строку, в зависимости от окончания строки вашей операционной системы и / или текстового редактора. Например, если вы напишите это и передадите его в git из систем linux, все может показаться хорошим - но если кто-то клонирует его в Windows, git преобразует ваши окончания строк в \r\nзависимости от того, для чего предназначена ваша строка ... вы может сломать мир.

Просто знайте об этом, когда вы сохраняете пустое пространство. Если вы напишите что-то вроде этого:

<System:String x:Key="TwoLiner" xml:space="preserve">
First line 
Second line 
</System:String>

Вы фактически добавили четыре переноса строк, возможно, четыре возврата каретки и потенциально незаполненный пробел ...


10
Кстати, вы можете просто применить xml:space="preserve"атрибут к ResourceDictionaryтакому, чтобы вам не нужно было применять его к каждой строке ресурса.
ocodo

1
Без амперсанда тоже работает. Примерно так: <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> (с разрывом строки между первой и второй строкой)
vgaltes

1
Я хотел бы дать вам +10 заxml:space="preserve"
TimothyP

1
@trooper Я только что внес правку, и она была оставлена ​​на усмотрение Jaykul / mod. И дальнейшие сборки Jaykul действительно прояснили мелкие детали здесь (так как мое редактирование не дало желаемый результат точно так, как хотелось). В целом, я бы сказал, что это взаимодействие помогает создавать даже лучшие ответы, а не публиковать свои собственные.
Энтони

21

Вам нужно просто удалить <TextBlock.Text>и добавить свой контент следующим образом:

    <Grid Margin="20">
        <TextBlock TextWrapping="Wrap" TextAlignment="Justify" FontSize="17">
        <Bold FontFamily="Segoe UI Light" FontSize="70">I.R. Iran</Bold><LineBreak/>
        <Span FontSize="35">I</Span>ran or Persia, officially the <Italic>Islamic Republic of Iran</Italic>, 
        is a country in Western Asia. The country is bordered on the 
        north by Armenia, Azerbaijan and Turkmenistan, with Kazakhstan and Russia 
        to the north across the Caspian Sea.<LineBreak/>
        <Span FontSize="10">For more information about Iran see <Hyperlink NavigateUri="http://en.WikiPedia.org/wiki/Iran">WikiPedia</Hyperlink></Span>
            <LineBreak/>
            <LineBreak/>
            <Span FontSize="12">
                <Span>Is this page helpful?</Span>
                <Button Content="No"/>
                <Button Content="Yes"/>
            </Span>
    </TextBlock>
    </Grid>

введите описание изображения здесь


И вопрос был « Как я могу добавить разрыв строки в текст, когда он задается как атрибут », атрибут, а не элемент.
минут

15

Обратите внимание, что для этого вам нужно сделать это в атрибуте Text, вы не можете использовать контент, как

<TextBlock>Stuff on line1&#x0a;Stuff on line 2</TextBlock>

12

Может быть, кто-то предпочитает

<TextBlock Text="{Binding StringFormat='Stuff on line1{0}Stuff on line2{0}Stuff on line3',
                          Source={x:Static s:Environment.NewLine}}" />

с xmlns:s="clr-namespace:System;assembly=mscorlib".


Хотя добавление & # x0a; кажется, работает из XAML, это не из кода. Этот делает.
FDF

11

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

Мое TextBlock.Textсвойство находилось внутри ToolTipService.ToolTipэлемента, и оно было связано со свойством объекта, данные которого извлекались из хранимой процедуры SQL. Теперь данные из этого конкретного свойства в хранимой процедуре извлекались из функции SQL.

Поскольку у меня ничего не получалось, я прекратил поиск и создал класс конвертера ниже:

public class NewLineConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var s = string.Empty;

        if (value.IsNotNull())
        {
            s = value.ToString();

            if (s.Contains("\\r\\n"))
                s = s.Replace("\\r\\n", Environment.NewLine);

            if (s.Contains("\\n"))
                s = s.Replace("\\n", Environment.NewLine);

            if (s.Contains("&#x0a;&#x0d;"))
                s = s.Replace("&#x0a;&#x0d;", Environment.NewLine);

            if (s.Contains("&#x0a;"))
                s = s.Replace("&#x0a;", Environment.NewLine);

            if (s.Contains("&#x0d;"))
                s = s.Replace("&#x0d;", Environment.NewLine);

            if (s.Contains("&#10;&#13;"))
                s = s.Replace("&#10;&#13;", Environment.NewLine);

            if (s.Contains("&#10;"))
                s = s.Replace("&#10;", Environment.NewLine);

            if (s.Contains("&#13;"))
                s = s.Replace("&#13;", Environment.NewLine);

            if (s.Contains("<br />"))
                s = s.Replace("<br />", Environment.NewLine);

            if (s.Contains("<LineBreak />"))
                s = s.Replace("<LineBreak />", Environment.NewLine);
        }

        return s;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

В итоге мне пришлось использовать Enivornment.NewLineметод из ответа @ dparker . Я дал указание конвертеру найти любое возможное текстовое представление новой строки и заменить его на Environment.NewLine.

Это сработало!

Однако я все еще был озадачен тем, почему ни один из других методов не работал со свойствами привязки к базе данных.

Я оставил комментарий на принятый ответ @ BobKing :

@BobKing - похоже, это не работает в ToolTipService.ToolTip при связывании с полем, в котором переводы строк встроены из SQL-кода.

Он ответил:

@CodeMaverick Если вы привязываетесь к тексту со встроенными новыми строками, они, вероятно, должны быть реальными значениями char 10 (или 13), а не сторожами XML. Это только если вы хотите писать буквально новые строки в файлах XAML.

Лампа погасла!

Я вошел в мою функцию SQL, заменил мои текстовые представления новых строк на ...

CHAR( 13 ) + CHAR( 10 )

... убрал конвертер из моей TextBlock.Textпривязки, и просто так ... он работал!


9

Я нашел это полезным, но столкнулся с некоторыми ошибками при добавлении его в тег «Content = ...» в XAML.

У меня было несколько строк в контенте, и позже я обнаружил, что в контенте есть пробелы, хотя я этого не указал. поэтому, чтобы обойти это и заставить его «игнорировать» пробел, я реализовал такой, как этот.

<ToolTip Width="200" Style="{StaticResource ToolTip}" 
         Content="'Text Line 1' 
                   &#x0a;&#x0d;'Text Line 2' 
                   &#x0a;&#x0d;'Text Line 3'"/>

надеюсь, это поможет кому-то еще.

(Вывод имеет три строки текста с пустой строкой между ними.)


вам лучше попробовать <ToolTip> <ToolTip.Content> <TextBlock Text = '.....' /> </ ToolTip.Content> </ ToolTip>
Simon_Weaver

5

Я понимаю, что это по старому вопросу, но просто хотел бы добавить, что

Environment.NewLine

также работает, если делать это через код.


4
<TextBlock>
    Stuff on line1 <LineBreak/>
    Stuff on line2
</TextBlock>

не то, чтобы это важно знать, но то, что вы указываете между тегами TextBlock, называется встроенным содержимым и переходит в свойство TextBlock.Inlines, которое является InlineCollection и содержит элементы типа Inline. Подклассами Inline являются Run и LineBreak, среди прочих. см. TextBlock.Inlines


3

Также не работает с

<TextBlock><TextBlock.Text>NO USING ABOVE TECHNIQUE HERE</TextBlock.Text>

Ничего страшного, просто нужно использовать

<TextBlock Text="Cool &#x0a;Newline trick" />

вместо.



-1

Код за решением

private void Button1_Click(object sender, RoutedEventArgs e)
{
    System.Text.StringBuilder myStringBuilder = new System.Text.StringBuilder();
    myStringBuilder.Append("Orange").AppendLine();
    myStringBuilder.Append("").AppendLine();
    myStringBuilder.Append("Apple").AppendLine();
    myStringBuilder.Append("Banana").AppendLine();
    myStringBuilder.Append("").AppendLine();
    myStringBuilder.Append("Plum").AppendLine();
    TextBox1.Text = myStringBuilder.ToString();
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.