Текстовый блок 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

<LineBreak/>

http://www.longhorncorner.com/UploadFile/mahesh/XamlLineBreak06092005152257PM/XamlLineBreak.aspx

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

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

<StackPanel>
    <TextBlock Text="Line1" />
    <TextBlock Text="Line2" />
</StackPanel>
Кэмерон МакФарланд
источник
5

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

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

user2063329
источник
Я пробовал это как контент для 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 и другими

user1551704
источник
1
(исправьте другой ответ и
3

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

новичок
источник
2

Это тоже отлично работает:

<TextBlock>
    <Run Text="My nice text"/>
    <LineBreak/>
    <LineBreak/>
    <Run Text="After some linebreaks, I'm back!"/>
</TextBlock>
Кристофер Эрикссон
источник
1

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

например.

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

MelloG
источник
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"
Blechdose
источник