字符串属性中的换行符

时间:2008-10-08 15:32:38

标签: xaml

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

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

将其分解为爆炸格式不适合我的特定情况。我需要的是模仿以下内容的方法:

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

13 个答案:

答案 0 :(得分:517)

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

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

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

另请注意:为了完整性,您可以绑定到已嵌入其中的换行符的文本,如后面代码中的常量或运行时构造的变量。

答案 1 :(得分:67)

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

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

答案 2 :(得分:53)

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

你实际上已经添加了四个换行符,可能还有四个回车符,以及可能隐藏的空白空格......

答案 3 :(得分:19)

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

答案 4 :(得分:15)

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

之类的内容
<TextBlock>Stuff on line1&#x0a;Stuff on line 2</TextBlock>

答案 5 :(得分: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"

答案 6 :(得分: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 answer中的Enivornment.NewLine方法。我指示转换器查找换行符的任何可能的文本表示形式,并将其替换为Environment.NewLine

这有效!

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

我对@BobKing's accepted answer发表了评论:

  

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

他回答说:

  

@CodeMaverick如果您使用嵌入的新行绑定到文本,它们可能应该是真正的char 10值(或13),而不是XML标记。仅当您要在XAML文件中编写文字新行时才会这样做。

灯泡熄灭了!

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

CHAR( 13 ) + CHAR( 10 )

...从我的TextBlock.Text绑定中移除转换器,就像那样...... 它有效!

答案 7 :(得分:9)

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

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

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

希望这有助于其他人。

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

答案 8 :(得分:3)

也不适用于

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

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

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

代替。

答案 9 :(得分:3)

我意识到这是旧问题,但只想添加

  

Environment.NewLine

如果通过代码执行此操作,也可以使用

答案 10 :(得分:1)

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

答案 11 :(得分:1)

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

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

答案 12 :(得分:-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();
}