Как добавить разрыв строки в текст, если он устанавливается как атрибут, например:
<TextBlock Text = "Stuff on line1 \n Stuff on line2" />
Разбивать его на разобранный формат - не вариант для моей конкретной ситуации. Мне нужен способ подражать следующему:
<TextBlock>
<TextBlock.Text>
Stuff on line1 <LineBreak/>
Stuff on line2
</TextBlock.Text>
<TextBlock/>





<TextBlock Text = "Stuff on line1
Stuff on line 2"/>
Вы можете использовать любое шестнадцатеричное значение для представления литерала. В данном случае я использовал перевод строки (символ 10). Если вы хотите сделать "классический" vbCrLf, то можете использовать 

Кстати, обратите внимание на синтаксис: это амперсанд, фунт, буква Икс, затем шестнадцатеричное значение нужного символа и, наконец, точка с запятой.
ТАКЖЕ: для полноты вы можете выполнить привязку к тексту, в который уже встроены переводы строк, как константа в вашем коде или переменная, созданная во время выполнения.
На сегодняшний день у меня 34 положительных голоса за этот ответ, и мне все еще пришлось вернуться и проверить, потому что синтаксис настолько архаичен.
Абсолютно. Я добавил это в закладки. Я должен приходить все время проверять это.
Также работает с содержимым кнопки (<Button Content = "Line one & # x0d; & # x0a; line 2" />)
@BobKing - похоже, это не работает в ToolTipService.ToolTip при привязке к полю, в которое встроены переводы строк из SQL sproc.
@CodeMaverick Если вы привязываетесь к тексту со встроенными новыми строками, они, вероятно, должны быть реальными значениями char 10 (или 13), а не часовыми XML. Это только в том случае, если вы хотите писать буквальные новые строки в файлах XAML.
@BobKing - Интересно. Итак, вы говорите, что в моей функции SQL, если бы я объединил свои 2 строки (или сколько угодно) с CHAR(13) и / или CHAR(10), они были бы правильно интерпретированы во всплывающей подсказке?
@BobKing - Я могу подтвердить, что это работает. Вау. Единственное, чего я не пробовал. Не могу поверить, что не подумал об этом.
'Архаический' ==> 'Тайный' :-)
Работает даже внутри параметра привязки при добавлении обратной косой черты, например: ConverterParameter = 'Test \ & # x0a; Text'
@BobKing Тогда воспользуйся ... намного более запоминающимся. ;)
@tcables, просто используйте xml:space = "preserve", тогда он также работает с тегами TextBlock.Text. Пример: <TextBlock xml:space = "preserve"><TextBlock.Text>First
Second</TextBlock.Text></TextBlock>
Также отлично работает с Xamarin.Forms.

 добавил пустое пространство перед переходом на новую строку в ОС Android (Xamarin)
Обратите внимание, что для этого вам нужно сделать это в атрибуте Text, вы не можете использовать контент, например
<TextBlock>Stuff on line1
Stuff on line 2</TextBlock>
Также не работает с
<TextBlock><TextBlock.Text>NO USING ABOVE TECHNIQUE HERE</TextBlock.Text>
Ничего страшного, просто нужно использовать
<TextBlock Text = "Cool 
Newline trick" />
вместо.
Возможно, вы можете использовать атрибут xml: space = "preserve" для сохранения пробелов в исходном XAML
<TextBlock xml:space = "preserve">
Stuff on line 1
Stuff on line 2
</TextBlock>
Вы также можете удалить xml: space = "preserve" и добавить <LineBreak /> между строками
Следует отметить (несколько лет спустя), что xml:space = "preserve" также сохранит отступы, которые обычно присутствуют в XAML. Таким образом, явный <LineBreak />, как предложено выше, кажется более чистым решением.
Спасибо! Это решение очень хорошо подходит для моего кода сериализации на основе XAML.
О, это отлично работает. Это сэкономило мне столько шаблонного кода. Благодарность
Когда вам нужно сделать это в строке (например: в ваших ресурсах), вам нужно использовать xml:space = "preserve"и коды символов амперсанда:
<System:String x:Key = "TwoLiner" xml:space = "preserve">First line 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, так что вам не нужно применять его к каждой строке ресурса.
Без амперсанда тоже работает. Примерно так: <System:String x:Key = "TwoLiner" xml:space = "preserve">First line Second line</System:String> (с разрывом строки между первой и второй строками)
Хотел бы я дать вам +10 для xml:space = "preserve"
@trooper Я только что внес правку, и это было оставлено на усмотрение Jaykul / мода. И дальнейшие сборки Jaykul действительно прояснили мелкие детали здесь (поскольку мое редактирование не давало желаемого результата в точности так, как хотелось бы). В целом я бы сказал, что это взаимодействие помогает создавать еще лучшие ответы, а не публиковать свои собственные.
<TextBox
Name = "myTextBox"
TextWrapping = "Wrap"
AcceptsReturn = "True"
VerticalScrollBarVisibility = "Visible" />
Я нашел это полезным, но столкнулся с некоторыми ошибками при добавлении его в тег «Content = ...» в XAML.
У меня было несколько строк в контенте, и позже я обнаружил, что в нем есть пробелы, хотя я этого не указывал. поэтому, чтобы обойти это и «игнорировать» пробелы, я реализовал вот так.
<ToolTip Width = "200" Style = "{StaticResource ToolTip}"
Content = "'Text Line 1'


'Text Line 2'


'Text Line 3'"/>
надеюсь, это поможет кому-то другому.
(На выходе есть три текстовые строки с пустой строкой между каждой.)
вам может быть лучше попробовать <ToolTip> <ToolTip.Content> <TextBlock Text = '.....' /> </ ToolTip.Content> </ToolTip>
Я понимаю, что это по более старому вопросу, но просто хотел добавить, что
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, а не с кодом. Этот делает.
Вам нужно просто удалить <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>

И вопрос был "Как добавить разрыв строки в текст, если он задан как атрибут", атрибут, а не элемент.
Для тех, кто пробовал каждый ответ на этот вопрос и по-прежнему ломает голову над тем, почему ни один из них не работает для вас, вы могли столкнуться с проблемой, с которой я столкнулся.
Мое свойство 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("

"))
s = s.Replace("

", Environment.NewLine);
if (s.Contains("
"))
s = s.Replace("
", Environment.NewLine);
if (s.Contains("
"))
s = s.Replace("
", Environment.NewLine);
if (s.Contains(" "))
s = s.Replace(" ", Environment.NewLine);
if (s.Contains(" "))
s = s.Replace(" ", Environment.NewLine);
if (s.Contains(" "))
s = s.Replace(" ", 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();
}
По-видимому, это не работает в тегах <TextBlock.Text> </ TextBlock.Text>.