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

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

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

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

当前回答

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

环境。换行符

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

其他回答

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

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

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

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

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

我的TextBlock。Text属性位于ToolTipService内部。元素,它绑定到一个对象的属性,该对象的数据正在从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();
    }
}

最后我不得不使用环境。NewLine方法来自@dparker的答案。我指示转换器寻找任何可能的换行符文本表示,并将其替换为Environment.NewLine。

这个工作!

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

我在@BobKing接受的答案下留言:

@BobKing -这似乎在ToolTipService中不起作用。绑定到从SQL sproc中嵌入换行符的字段时的工具提示。

他回答说:

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

一个灯泡坏了!

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

CHAR( 13 ) + CHAR( 10 )

... 从我的TextBlock删除转换器。文本绑定,就像这样……它工作!

也许你可以使用属性xml:space="preserve"来保存源XAML中的空白

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

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

环境。换行符

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

你只需要删除<TextBlock。文本>,并简单地添加您的内容如下:

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