字符串属性中的换行符

Posted

技术标签:

【中文标题】字符串属性中的换行符【英文标题】:Newline in string attribute 【发布时间】:2010-09-16 01:16:18 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:
<TextBlock Text="Stuff on line1&#x0a;Stuff on line 2"/>

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

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

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

【讨论】:

显然这在 标签中不起作用。 截至今天,我对这个答案有 34 个赞成票,但我仍然不得不回来检查,因为语法太陈旧了。 当然。我有这个书签。我必须一直来检查它。 'Archaic' ==> 'Arcane' :-) 在添加反斜杠时,即使在绑定参数中也可以使用:ConverterParameter='Test\ Text'【参考方案2】:

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

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

【讨论】:

您也可以删除 xml:space="preserve" 并在行之间添加 应该注意(几年后)xml:space="preserve" 也会保留缩进空格,这通常存在于 XAML 中。因此,上面建议的显式 &lt;LineBreak /&gt; 似乎是一个更清洁的解决方案。 谢谢!这个解决方案非常适合我的基于 XAML 的序列化代码。 哦,这很完美。它为我节省了很多样板代码。谢谢【参考方案3】:

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

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

【讨论】:

顺便说一句,您也可以将xml:space="preserve" 属性应用于ResourceDictionary,这样您就不需要将其应用于每个资源字符串。 没有 & 符号也可以。像这样:&lt;System:String x:Key="TwoLiner" xml:space="preserve"&gt;First line Second line&lt;/System:String&gt;(第一行和第二行之间有换行符) 我希望我能给你 +10 xml:space="preserve" @trooper 我刚刚进行了编辑,并由 Jaykul/mod 批准。 Jaykul 的进一步构建确实澄清了这里的小细节(因为我的编辑没有完全按照想要的方式给出所需的输出)。总的来说,我会说这种互动有助于创造更好的答案,而不是发布我自己的答案。 xml:space="preserve" 这对我有帮助。谢谢【参考方案4】:

您只需删除 &lt;TextBlock.Text&gt; 并简单地添加您的内容,如下所示:

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

【讨论】:

问题是“如何在将文本设置为属性时添加换行符”,属性,而不是元素。【参考方案5】:

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

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

【讨论】:

【参考方案6】:

也许有人更喜欢

<TextBlock Text="Binding StringFormat='Stuff on line10Stuff on line20Stuff on line3',
                          Source=x:Static s:Environment.NewLine" />

xmlns:s="clr-namespace:System;assembly=mscorlib"

【讨论】:

虽然添加了 似乎适用于 XAML,但不适用于代码。这个可以。【参考方案7】:

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

我的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 存储过程中嵌入换行符的字段时,这似乎在 ToolTipService.ToolTip 中不起作用。

他回答说:

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

一个灯泡熄灭了!

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

CHAR( 13 ) + CHAR( 10 )

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

【讨论】:

【参考方案8】:

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

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

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

希望这对其他人有帮助。

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

【讨论】:

你最好试试 【参考方案9】:

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

Environment.NewLine

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

【讨论】:

【参考方案10】:
<TextBlock>
    Stuff on line1 <LineBreak/>
    Stuff on line2
</TextBlock>

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

【讨论】:

【参考方案11】:

也不适用于

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

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

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

改为。

【讨论】:

【参考方案12】:
<TextBox 
    Name="myTextBox" 
    TextWrapping="Wrap" 
    AcceptsReturn="True" 
    VerticalScrollBarVisibility="Visible" />

【讨论】:

【参考方案13】:

解决方案背后的代码

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

【讨论】:

以上是关于字符串属性中的换行符的主要内容,如果未能解决你的问题,请参考以下文章

用 XSLT 替换 XML 属性中的换行符

C# 中的回车换行符

如何使用java让XML节点中的属性换行?如下所示!

TD不换行 nowrap属性

MFC的CEdit多于1024个字符自动换行

Spring 属性中的换行符