Новая строка в строковом атрибуте - PullRequest
267 голосов
/ 08 октября 2008

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

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

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

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

Ответы [ 12 ]

518 голосов
/ 08 октября 2008
<TextBlock Text="Stuff on line1&#x0a;Stuff on line 2"/>

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

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

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

67 голосов
/ 20 октября 2010

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

<TextBlock xml:space="preserve">
Stuff on line 1
Stuff on line 2
</TextBlock>
53 голосов
/ 02 ноября 2010

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

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

19 голосов
/ 20 июля 2013

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

enter image description here

15 голосов
/ 12 февраля 2009

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

<TextBlock>Stuff on line1&#x0a;Stuff on line 2</TextBlock>
12 голосов
/ 06 сентября 2012

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

<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".

11 голосов
/ 11 февраля 2014

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

Мое 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 голосов
/ 06 июля 2011

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

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

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

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

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

3 голосов
/ 30 мая 2012

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

Environment.NewLine

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

3 голосов
/ 03 февраля 2010

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

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

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

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

вместо.

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