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

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

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

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

<TextBlock>
  <TextBlock.Text>
    Stuff on line1 <LineBreak/>
    Stuff on line2
  </TextBlock.Text>
<TextBlock/>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
293
0
160 814
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Ответ принят как подходящий

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

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

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

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

По-видимому, это не работает в тегах <TextBlock.Text> </ TextBlock.Text>.

tcables 22.12.2010 11:36

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

Bob King 07.03.2011 05:48

Абсолютно. Я добавил это в закладки. Я должен приходить все время проверять это.

MojoFilter 25.04.2011 22:45

Также работает с содержимым кнопки (<Button Content = "Line one & # x0d; & # x0a; line 2" />)

Toadums 31.05.2012 22:12

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

Code Maverick 15.01.2014 03:03

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

Bob King 10.02.2014 22:20

@BobKing - Интересно. Итак, вы говорите, что в моей функции SQL, если бы я объединил свои 2 строки (или сколько угодно) с CHAR(13) и / или CHAR(10), они были бы правильно интерпретированы во всплывающей подсказке?

Code Maverick 10.02.2014 22:25

@BobKing - Я могу подтвердить, что это работает. Вау. Единственное, чего я не пробовал. Не могу поверить, что не подумал об этом.

Code Maverick 10.02.2014 22:32

'Архаический' ==> 'Тайный' :-)

Will Dean 19.02.2015 17:49

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

Sven 23.04.2015 18:28

@BobKing Тогда воспользуйся &#10; ... намного более запоминающимся. ;)

Salman von Abbas 16.04.2016 08:01

@tcables, просто используйте xml:space = "preserve", тогда он также работает с тегами TextBlock.Text. Пример: <TextBlock xml:space = "preserve"><TextBlock.Text>First&#x0a;Second</Text‌​Block.Text></TextBlo‌​ck>

chviLadislav 26.06.2018 15:15

Также отлично работает с Xamarin.Forms.

Mikalai Daronin 23.02.2019 16:55

&#x0d; добавил пустое пространство перед переходом на новую строку в ОС Android (Xamarin)

Fabrice T 13.09.2020 00:41

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

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

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

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

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

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

вместо.

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

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

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

usefulBee 17.09.2014 18:38

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

Zeus 05.08.2016 04:14

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

Seraphim 28.01.2017 17:11

О, это отлично работает. Это сэкономило мне столько шаблонного кода. Благодарность

iam.Carrot 03.02.2020 00:18

Когда вам нужно сделать это в строке (например: в ваших ресурсах), вам нужно использовать 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>

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

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

ocodo 23.02.2011 03:51

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

vgaltes 07.07.2015 11:28

Хотел бы я дать вам +10 для xml:space = "preserve"

TimothyP 26.10.2016 12:14

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

wooobie 28.03.2017 18:57

<TextBox 
    Name = "myTextBox" 
    TextWrapping = "Wrap" 
    AcceptsReturn = "True" 
    VerticalScrollBarVisibility = "Visible" />

Я нашел это полезным, но столкнулся с некоторыми ошибками при добавлении его в тег «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 21.11.2011 07:19

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

Environment.NewLine

также работает, если это делается с помощью кода.

Может кто-то предпочтет

<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, а не с кодом. Этот делает.

F.D.F. 14.01.2015 12:19

Вам нужно просто удалить <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>

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

mins 18.11.2019 12:22

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

Мое свойство 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 - This doesn't seem to work in the ToolTipService.ToolTip when binding to a field that has the line feeds embedded from a SQL sproc.

Он ответил:

@CodeMaverick If you're binding to text with the new lines embedded, they should probably be real char 10 values (or 13's) and not the XML sentinels. This is only if you want to write literal new lines in XAML files.

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

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

CHAR( 13 ) + CHAR( 10 )

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

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

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

Код решения

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();
}

Другие вопросы по теме