字符串属性中的换行符


283

将文本设置为属性时,如何在文本上添加换行符:

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

对于我的特殊情况,将其分解为爆炸格式不是一种选择。我需要某种模仿以下内容的方法:

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

Answers:


553
<TextBlock Text="Stuff on line1&#x0a;Stuff on line 2"/>

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

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

还:为了完整起见,您可以绑定到已经嵌入换行符的文本,例如,后面的代码中的常量或在运行时构造的变量。


14
显然,这在<TextBlock.Text> </ TextBlock.Text>标签中不起作用。
tcables 2010年

45
截至今天,我对此答案有34个赞成票,但由于语法太过陈旧,我仍然不得不回来检查。
鲍勃·金

3
绝对。我有这个书签。我必须一直来检查一下。
MojoFilter

4
'Archaic'==>'Arcane':-)
Will Dean

5
添加反斜杠时,即使在绑定参数中也可以使用,例如:ConverterParameter ='Test \&#x0a; Text'–
Sven

72

可能是您可以使用xml:space =“ preserve”属性在源XAML中保留空白

<TextBlock xml:space="preserve">
Stuff on line 1
Stuff on line 2
</TextBlock>

8
您还可以删除xml:space =“ preserve”并在各行之间添加<LineBreak />
有用的

5
应该指出的是(几年后)xml:space="preserve"还将保留缩进空间,缩进空间通常出现在XAML中。因此,<LineBreak />上面建议的显式似乎是一种更干净的解决方案。
宙斯

谢谢!此解决方案非常适合我的基于XAML的序列化代码。
塞拉芬

哦,这很完美。它为我节省了很多样板代码。谢谢
iam.Carrot

56

当您需要在字符串中(例如,在您的资源中)执行此操作时,需要使用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>

实际上,您已经添加了四个换行符,可能有四个回车符,并且可能在尾部添加了不可见的空格...


10
顺便说一句,您也可以将xml:space="preserve"属性也应用于该属性ResourceDictionary,因此您无需将其应用于每个资源字符串。
ocodo 2011年

1
没有&符也可以。这样的事情:( <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> 在第一行和第二行之间有换行符)
vgaltes

1
希望我能给您+10xml:space="preserve"
TimothyP

1
@trooper我刚刚进行了编辑,它留待Jaykul / mod批准。Jaykul的进一步构建确实澄清了此处的次要细节(因为我的编辑未完全提供所需的期望输出)。总的来说,我认为这种互动方式比起发布自己的方式,还可以提供更好的答案。
安东尼·卢萨尔迪

21

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

在此处输入图片说明


问题是“ 将文本设置为属性时,如何在文本上添加换行符 ”,而不是元素。
分钟

15

请注意,要执行此操作,您需要在Text属性中执行此操作,您不能使用类似

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

12

也许有人喜欢

<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运行,而不能从代码运行。这一个。
FDF

11

对于那些尝试了这个问题的所有答案但仍然都不为您服务的人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("&#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-绑定到具有从SQL sproc嵌入换行符的字段时,在ToolTipService.ToolTip中似乎不起作用。

他回答:

@CodeMaverick如果您要绑定嵌入新行的文本,则它们可能应该是真实的char 10值(或13的值),而不是XML标记。仅当您想在XAML文件中编写原义的新行时。

一个灯泡熄灭了!

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

CHAR( 13 ) + CHAR( 10 )

...从我的TextBlock.Text绑定中删除了转换器,就这样... 它起作用了!


9

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

我在内容中有多行,后来发现即使我没有指定内容,内容仍保留空格。为了解决这个问题并使它“忽略”空白,我实现了这样的方法。

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

希望这对其他人有帮助。

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


您可能最好尝试<ToolTip> <ToolTip.Content> <TextBlock Text ='.....'/> </ ToolTip.Content> </ ToolTip>
Simon_Weaver

5

我意识到这是一个较旧的问题,但只想补充一点

环境换行

如果通过代码执行此操作也可以。


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

并不是很重要,但是您在TextBlock标记之间指定的内容称为内联内容,并进入TextBlock.Inlines属性,该属性是InlineCollection,其中包含Inline类型的项。Inline的子类包括Run和LineBreak等。参见TextBlock.Inlines


3

也不适用于

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

没什么大不了的,只需要使用

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

代替。



-1

解决方案背后的代码

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();
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.