将文本设置为属性时,如何在文本上添加换行符:
<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 \n Stuff on line2" />
对于我的特殊情况,将其分解为爆炸格式不是一种选择。我需要某种模仿以下内容的方法:
<TextBlock>
<TextBlock.Text>
Stuff on line1 <LineBreak/>
Stuff on line2
</TextBlock.Text>
<TextBlock/>
Answers:
<TextBlock Text="Stuff on line1
Stuff on line 2"/>
您可以使用任何十六进制编码的值来表示文字。在这种情况下,我使用了换行符(字符10)。如果你想做“经典”vbCrLf
,那么您可以使用

顺便说一句,请注意以下语法:它是&号,一个磅,一个字母x,然后是您想要的字符的十六进制值,最后是一个分号。
还:为了完整起见,您可以绑定到已经嵌入换行符的文本,例如,后面的代码中的常量或在运行时构造的变量。
可能是您可以使用xml:space =“ preserve”属性在源XAML中保留空白
<TextBlock xml:space="preserve">
Stuff on line 1
Stuff on line 2
</TextBlock>
xml:space="preserve"
还将保留缩进空间,缩进空间通常出现在XAML中。因此,<LineBreak />
上面建议的显式似乎是一种更干净的解决方案。
当您需要在字符串中(例如,在您的资源中)执行此操作时,需要使用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>
警告:如果你写像第二个示例代码,您插入任何一个换行符,或者回车和换行,取决于行结束您的操作系统和/或文本编辑器的使用。例如,如果您编写该代码并将其提交到Linux系统的git中,那么一切似乎都很好-但如果有人将其克隆到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>
在第一行和第二行之间有换行符)
xml:space="preserve"
您只需要删除<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>
请注意,要执行此操作,您需要在Text属性中执行此操作,您不能使用类似
<TextBlock>Stuff on line1
Stuff on line 2</TextBlock>
对于那些尝试了这个问题的所有答案但仍然都不为您服务的人scratch之以鼻的人,您可能会遇到我遇到的问题。
我的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();
}
}
我最终不得不使用@dparker的答案中的Enivornment.NewLine
方法。我指示转换程序寻找换行符的任何可能的文本表示形式,并将其替换为。Environment.NewLine
这工作了!
但是,对于为什么其他方法都无法使用数据绑定属性,我仍然感到困惑。
我对@BobKing接受的答案发表了评论:
@BobKing-绑定到具有从SQL sproc嵌入换行符的字段时,在ToolTipService.ToolTip中似乎不起作用。
他回答:
@CodeMaverick如果您要绑定嵌入新行的文本,则它们可能应该是真实的char 10值(或13的值),而不是XML标记。仅当您想在XAML文件中编写原义的新行时。
一个灯泡熄灭了!
我进入SQL函数,将换行符的文本表示形式替换为...
CHAR( 13 ) + CHAR( 10 )
...从我的TextBlock.Text
绑定中删除了转换器,就这样... 它起作用了!
我发现这很有用,但是在将其添加到XAML中的“ Content = ...”标记时遇到了一些错误。
我在内容中有多行,后来发现即使我没有指定内容,内容仍保留空格。为了解决这个问题并使它“忽略”空白,我实现了这样的方法。
<ToolTip Width="200" Style="{StaticResource ToolTip}"
Content="'Text Line 1'


'Text Line 2'


'Text Line 3'"/>
希望这对其他人有帮助。
(输出是三个文本行,每行之间有一个空行。)
<TextBlock>
Stuff on line1 <LineBreak/>
Stuff on line2
</TextBlock>
并不是很重要,但是您在TextBlock标记之间指定的内容称为内联内容,并进入TextBlock.Inlines属性,该属性是InlineCollection,其中包含Inline类型的项。Inline的子类包括Run和LineBreak等。参见TextBlock.Inlines
<TextBox
Name="myTextBox"
TextWrapping="Wrap"
AcceptsReturn="True"
VerticalScrollBarVisibility="Visible" />
解决方案背后的代码
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();
}