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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Свойство My 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 answer. Я попросил конвертер искать любое возможное текстовое представление новой строки и заменить его на Environment.NewLine.

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

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

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

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

Он ответил:

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

Вышла лампочка!

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

CHAR( 13 ) + CHAR( 10 )

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

Ответ 8

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

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

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

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

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

Ответ 9

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

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

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

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

вместо.

Ответ 10

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

Environment.NewLine

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

Ответ 11

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

Ответ 12

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

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