字符串属性中的换行符

当文本被设置为属性时,我如何添加换行符:

<TextBlock Text="Stuff on line1 \n Stuff on line2" />

把它分解成分解格式不适合我的特殊情况。我需要的是一些方法来模仿以下:

<TextBlock>
<TextBlock.Text>
Stuff on line1 <LineBreak/>
Stuff on line2
</TextBlock.Text>
<TextBlock/>
176917 次浏览
<TextBlock Text="Stuff on line1&#x0a;Stuff on line 2"/>

您可以使用任何十六进制编码的值来表示文字。在本例中,我使用换行(char 10)。如果你想做“经典的”vbCrLf,那么你可以使用&#x0d;&#x0a;

顺便说一下,注意语法:它是&号,一个磅,字母x,然后是你想要的字符的十六进制值,最后是一个分号。

此外:为了完整起见,您可以绑定到已经嵌入换行符的文本,就像后面代码中的常量或运行时构造的变量一样。

注意,要做到这一点,你需要在文本属性中这样做,你不能使用像这样的内容

<TextBlock>Stuff on line1&#x0a;Stuff on line 2</TextBlock>

也不工作

<TextBlock><TextBlock.Text>NO USING ABOVE TECHNIQUE HERE</TextBlock.Text>

没什么大不了的,只是需要用一下

<TextBlock Text="Cool &#x0a;Newline trick" />

代替。

也许你可以使用属性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&#10;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>

你实际上添加了4个换行符,可能是4个回车符,以及潜在的不可见的尾随空白……

<TextBox
Name="myTextBox"
TextWrapping="Wrap"
AcceptsReturn="True"
VerticalScrollBarVisibility="Visible" />

我发现这很有帮助,但在XAML中将其添加到“Content=…”标记时遇到了一些错误。

我在内容中有多行,后来发现内容保留了空白,尽管我没有指定这一点。所以为了解决这个问题,让它“忽略”空白,我实现了这样的功能。

<ToolTip Width="200" Style="{StaticResource ToolTip}"
Content="'Text Line 1'
&#x0a;&#x0d;'Text Line 2'
&#x0a;&#x0d;'Text Line 3'"/>

希望这能帮助到其他人。

(输出有三个文本行,每行之间有一个空行。)

我知道这是一个老问题,但我只是想补充一下

环境。换行符

如果通过代码来做这个也可以。

也许有人更喜欢

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

你只需要删除<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

对于那些尝试过这个问题的每一个答案,并抓着头不知道为什么它们都不适合你的人来说,你可能遇到了我遇到的问题的一种形式。

我的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("&#x0a;&#x0d;"))
s = s.Replace("&#x0a;&#x0d;", Environment.NewLine);


if (s.Contains("&#x0a;"))
s = s.Replace("&#x0a;", Environment.NewLine);


if (s.Contains("&#x0d;"))
s = s.Replace("&#x0d;", Environment.NewLine);


if (s.Contains("&#10;&#13;"))
s = s.Replace("&#10;&#13;", Environment.NewLine);


if (s.Contains("&#10;"))
s = s.Replace("&#10;", Environment.NewLine);


if (s.Contains("&#13;"))
s = s.Replace("&#13;", 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 -这似乎在ToolTipService中不起作用。绑定到从SQL sproc中嵌入换行符的字段时的工具提示。

他回答说:

@CodeMaverick如果你绑定到嵌入新行文本,它们可能应该是真正的char 10值(或13),而不是XML哨兵。这仅适用于在XAML文件中写入文字新行。

一个灯泡坏了!

我进入我的SQL函数,将换行符的文本表示替换为…

CHAR( 13 ) + CHAR( 10 )

... 从我的TextBlock.Text绑定中删除转换器,就像这样…< em >工作!< / em >

<TextBlock>
Stuff on line1 <LineBreak/>
Stuff on line2
</TextBlock>

不是说重要的是要知道,但你指定之间的TextBlock标签被称为内联内容,进入TextBlock。属性,它是一个InlineCollection,包含内联类型的项。 内联的子类包括Run和LineBreak等。 看到TextBlock。内联 < / p >

解决方案背后的代码

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();
}