Новая строка в атрибуте 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
Stuff on line 2"/>
Вы можете использовать любое шестнадцатеричное кодированное значение для представления литерала. В этом случае я использовал линию (char 10). Если вы хотите сделать "классический" vbCrLf
, вы можете использовать 

Кстати, обратите внимание на синтаксис: это амперсанд, фунт, буква 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 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
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("

"))
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 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'


'Text Line 2'


'Text Line 3'"/>
надеюсь, что это поможет кому-то другому.
(Выход имеет три строки текста с пустой строкой между ними.)
Ответ 9
Также не работает с
<TextBlock><TextBlock.Text>NO USING ABOVE TECHNIQUE HERE</TextBlock.Text>
Нечего делать, просто нужно использовать
<TextBlock Text="Cool 
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