Строки в строку атрибута
Как я могу добавить разрыв строки в текст, когда он задается в качестве атрибута, т. е.:
<TextBlock Text="Stuff on line1 n Stuff on line2" />
Разбивка его на разнесенный формат не является вариантом для моей конкретной ситуации. Что мне нужно, так это какой-то способ эмулировать следующее:
<TextBlock>
<TextBlock.Text>
Stuff on line1 <LineBreak/>
Stuff on line2
</TextBlock.Text>
<TextBlock/>
12 ответов:
<TextBlock Text="Stuff on line1
Stuff on line 2"/>Для представления литерала можно использовать любое шестнадцатеричное кодированное значение. В этом случае я использовал линейную подачу (char 10). Если вы хотите сделать "классический"
Кстати, обратите внимание на синтаксис: это амперсанд, фунт, буква x , затем шестнадцатеричное значение нужного символа и, наконец, точка с запятой.vbCrLf, то вы можете использовать
Также: для полноты можно выполнить привязку к тексту, в который уже встроены каналы строк, как константа в коде., или переменная, построенная во время выполнения.
Возможно, вы можете использовать атрибут xml: space= "preserve" для сохранения пробела в исходном XAML
<TextBlock xml:space="preserve"> Stuff on line 1 Stuff on line 2 </TextBlock>
Когда вам нужно сделать это в строке (например: в ваших ресурсах), вы должны использовать
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>Вы фактически добавили четыре разрыва строки, возможно, четыре возврата каретки и потенциально замыкающий пробел, который невидим...
Вам нужно просто удалить
<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>Stuff on line1
Stuff on line 2</TextBlock>
Может быть, кто-то предпочитает
<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".
Я нашел это полезным, но столкнулся с некоторыми ошибками при добавлении его в "Content=...- тег в XAML.
У меня было несколько строк в содержании, и позже я обнаружил, что содержимое содержало пробелы, хотя я этого не уточнял. так что, чтобы обойти это и заставить его "игнорировать" пробелы, я реализовал такой вариант.
<ToolTip Width="200" Style="{StaticResource ToolTip}" Content="'Text Line 1' 

'Text Line 2' 

'Text Line 3'"/>Надеюсь, что это помогает кто-то другой.
(вывод состоит из трех строк текста с пустой строкой между ними.)
Для тех, кто перепробовал все ответы на этот вопрос и все еще ломает голову над тем, почему ни один из них не работает на вас, вы могли бы столкнуться с формой проблемы, с которой столкнулся я.
Мое свойство
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-похоже, это не работает в ToolTipService.Всплывающая подсказка при привязке к полю, в которое встроены каналы строк из SQL sproc.
Он ответил:
@CodeMaverick если вы привязываете к тексту новые строки, они, вероятно, должны быть реальными значениями char 10 (или 13), а не XML-сентинелами. Это только в том случае, если вы хотите написать литеральные новые строки в XAML файлы.
Загорелась лампочка!
Я вошел в свою функцию SQL, заменил мои текстовые представления новых строк на ...
CHAR( 13 ) + CHAR( 10 )... удалил конвертер из моей привязки
TextBlock.Text, и все так же ... это сработало!
Также не работает с
<TextBlock><TextBlock.Text>NO USING ABOVE TECHNIQUE HERE</TextBlock.Text>Ничего особенного, просто нужно было использовать
<TextBlock Text="Cool 
Newline trick" />Вместо этого.
Я понимаю, что это более старый вопрос, но просто хотел добавить, что
Окружающая среда.Новая строка
Также работает, если делать это через код.
<TextBox Name="myTextBox" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Visible" />
<TextBlock> Stuff on line1 <LineBreak/> Stuff on line2 </TextBlock>Не то чтобы это важно знать, но то, что вы указываете между тегами TextBlock, называется встроенным содержимым и входит в текстовый блок.Свойство Inlines, которое является коллекцией InlineCollection и содержит элементы типа Inline. Подклассы встроенных и переноса, у других. см.Раздел TextBlock.Inlines

Comments