Текстовый блок WPF, разрыв строки в текстовом атрибуте


96

Есть ли способ \nсделать разрыв строки в TextBlock?

<TextBlock Text="line1\nLine2" />

Или есть лучший способ заставить разрыв средней строки внутри Textатрибута?

<LineBreak />

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

Я знаком, LineBreakно это не тот ответ, который я ищу.


2
в xaml вы должны использовать управляющие символы <TextBlock Name = "txtBlock" Text = "Line1 & # 10; Line2" />, если вы хотите использовать символ \ n, он работает только с кодом за txtBlock.Text = "line1 \ nline2 ";
JJ_Coder4Hire

& # 10; отлично работает в xaml. Спасибо, JJ_Coder4Hire!
Кей Ли

Ответы:


116

Я знаю, что это возвращает старый вопрос, но у меня была та же проблема. Решением для меня было использование перевода строки в кодировке HTML ( &amp;#10;).

Line1&amp;#10;Line2

Похоже

Строка1
Строка2

Чтобы узнать больше о закодированных HTML-символах, посетите w3schools.


19
@Knasterbax, если текст указан как содержимое между <TextBlock>и </TextBlock>тогда да, вам понадобится <LineBreak/>. &#10;работает внутри Textатрибута:<TextBlock Text="..." />
Роман Старков

6
"& # 10;" работал у меня. Мне не нужен "& amp;" как уже упоминалось. Этот метод также будет работать при установке текста следующим образом: <Setter Property = "Text" Value = "Line 1 & # 10; & # 10; Line 2" />
EdwardM

126

Попробуй это:

<TextBlock>
    line1
    <LineBreak />
    line2
</TextBlock>

1
Я не пробовал это напрямую, но вы могли бы попробовать xml: space = "preserve", а затем напрямую встроить разрыв строки в свойство Text.
Пол Александр

3
Вопросы капитализации. Это <LineBreak />.
М. Дадли

10

Самый простой способ

<TextBlock> blabla <LineBreak /> coucou <LineBreak /> coucou 2 </TextBlock>

Итак, вы просто пишете код XAML, и он <LineBreak />имеет то же значение, что и
в HTML, или «\ n» в C #.


1
Повторяющийся ответ Пола Александера.
vapcguy

7

3
Скотт, я не понимаю вашего комментария.
jcollum

1
Проблема в том, что <LineBreak /> не работает в Windows XP. Это также может иметь какое-то отношение к установленной версии .NET. Нет никаких исключений и ошибок, кроме некорректного отображения визуальных элементов.
Чарльз


5

<LineBreak /> не будет работать, если он находится внутри коллекции, такой как Grid или StackPanel. В таких случаях будет работать следующее:

LineBreak внутри коллекции


Я пробовал это как контент для RadioButton. Все работало нормально, пока я не запустил программу в Windows 7. В Windows 7 кнопка была расположена вертикально по центру между двумя строками. Windows 10 по умолчанию выравнивает кнопку по верхнему краю. В то время как Windows 10 будет учитывать свойство VerticalContentAlignment, Windows 7 игнорирует его. Пришлось использовать решение LineBreak.
mrfelis

5

Правильный способ его использования может заключаться в следующем:

<TextBlock>  
    <Span>text1</Span>  
    <LineBreak/>  
    <Span>text2</Span>  
</TextBlock>

3
  <HyperlinkButton 
        Content="Apply and restart this pplication!&#10;&#13;Note that modifying these settings requires the application to be restarted."   />

CRLF простой способ = !&#10;&#13;

!&#10;&#13; - Работайте со всеми элементами управления wpf, xaml, silverlight, такими как TextBlock, HyperlinkText и другими


1
(исправьте другой ответ и

3

Если вы привязываете TextBlock к тексту, другие ответы не работают. Просто добавьте '\ n' к тексту привязки туда, где вы хотите разорвать.



1

просто используйте элемент управления AccessText. вы можете использовать его как ярлык, и у вас есть свойство TextWrapping = "WrapWithOverflow"

например.

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


1

Я опаздываю на вечеринку, но ... это более или менее то, как я это сделал (помните, что мои ItemSources - это простые строки, не отформатированные, и мне не нужно было ничего 'convertBack')

public class SpaceToLineBreakConverter : IValueConverter
{   
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {            
        return (!String.IsNullOrEmpty(value as string)) 
        ? new Regex(@"\s").Replace(value as string, "\n") 
        : value;            
    }

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

0

У меня была аналогичная проблема, и я хотел привязать строку разметки xaml к TextBlock. По сути, декларативная разметка сохраняется внутри TextBlock в строке для дальнейшего использования.

Вот как я это сделал : я создал подклассы TextBlock, чтобы сделать InlineCollection связываемой, и написал Converter между строкой и InlineCollection (или фактически общим списком Inlines).


0

&amp;#10;у меня это не сработало, когда я использовал привязку. Но это работает:

$"first line {Environment.NewLine} second line"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.