303

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

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

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

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

13 回答 13

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

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

顺便说一句,请注意语法:它是与号、磅、字母x,然后是所需字符的十六进制值,最后是分号。

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

于 2008-10-08T15:39:42.500 回答
73

可能您可以使用属性 xml:space="preserve" 在源 XAML 中保留空格

<TextBlock xml:space="preserve">
Stuff on line 1
Stuff on line 2
</TextBlock>
于 2010-10-20T12:21:08.437 回答
61

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

您实际上已经添加了四个换行符,可能是四个回车符,以及可能不可见的尾随空格......

于 2010-11-02T19:01:32.697 回答
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>

在此处输入图像描述

于 2013-07-20T11:34:50.760 回答
16

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

<TextBlock>Stuff on line1&#x0a;Stuff on line 2</TextBlock>
于 2009-02-12T14:54:12.090 回答
13

也许有人更喜欢

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

于 2012-09-06T12:55:25.460 回答
11

对于那些已经尝试了这个问题的所有答案并且仍然对为什么它们都不适合你的人来说,你可能已经遇到了我遇到的问题的一种形式。

我的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's answerEnivornment.NewLine中的方法。我指示转换器查找换行符的任何可能的文本表示并将其替换为.Environment.NewLine

这行得通!

但是,我仍然对为什么没有其他方法适用于数据绑定属性感到困惑。

我对@BobKing 接受的答案发表了评论:

@BobKing - 当绑定到从 SQL 存储过程中嵌入换行符的字段时,这似乎在 ToolTipService.ToolTip 中不起作用。

他回答说:

@CodeMaverick 如果您要绑定到嵌入了新行的文本,它们可能应该是真正的 char 10 值(或 13 值)而不是 XML 标记。这仅适用于您想在 XAML 文件中编写文字换行符。

一个灯泡灭了!

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

CHAR( 13 ) + CHAR( 10 )

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

于 2014-02-11T17:47:10.743 回答
9

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

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

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

希望这对其他人有帮助。

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

于 2011-07-06T05:44:48.940 回答
5

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

环境.新线

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

于 2012-05-30T19:57:00.107 回答
4
<TextBlock>
    Stuff on line1 <LineBreak/>
    Stuff on line2
</TextBlock>

知道这并不重要,但您在 TextBlock 标记之间指定的内容称为内联内容并进入 TextBlock.Inlines 属性,该属性是一个 InlineCollection 并包含内联类型的项目。Inline 的子类是 Run 和 LineBreak 等。见TextBlock.Inlines

于 2017-11-24T10:20:48.013 回答
3

也不适用于

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

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

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

反而。

于 2010-02-03T02:35:17.863 回答
1
<TextBox 
    Name="myTextBox" 
    TextWrapping="Wrap" 
    AcceptsReturn="True" 
    VerticalScrollBarVisibility="Visible" />
于 2011-04-25T02:59:55.117 回答
-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();
}
于 2020-06-05T00:57:08.170 回答