4

假设我有一些这样的 XAML:

<Window.Resources>
  <v:MyClass x:Key="whatever" Text="foo\nbar" />
</Window.Resources>

显然,我想要 MyClass.Text 属性中的换行符,但 XAML 解析器使用文字字符串“foo\nbar”构造对象。

是否有 (a) 一种方法可以说服解析器翻译转义序列,或者 (b) 一种 .NET 方法以 C# 编译器的方式解释字符串?

我意识到我可以去那里寻找\n序列,但如果有一个通用的方法来做到这一点会更好。

4

4 回答 4

13

您可以使用 XML 字符转义

<TextBlock Text="Hello&#13;World!"/>
于 2008-09-22T18:45:19.053 回答
1

从我的头顶上,尝试;

  1. 也许是自定义绑定表达式?

<v:MyClass x:Key="whatever" Text="{MyBinder foo\nbar}"/>

  1. 使用字符串静态资源?

  2. 使 Text 成为控件的默认属性,并且;

<v:MyClass x:Key="whatever">
foo
bar
</v:MyClass>
于 2008-09-22T15:31:32.140 回答
1

我意识到我可以去那里寻找 \n 序列,[...]

如果您只关心 \n,那么您可以尝试以下操作:

string s = "foo\\nbar";
s = s.Replace("\\n", "\n");

或者,对于 b),因为我不知道也找不到执行此操作的内置函数,例如:

using System.Text.RegularExpressions;

// snip
string s = "foo\\nbar";
Regex r = new Regex("\\\\[rnt\\\\]");
s = r.Replace(s, ReplaceControlChars); ;
// /snip

string ReplaceControlChars(Match m)
{
    switch (m.ToString()[1])
    {
        case 'r': return "\r";
        case 'n': return "\n";
        case '\\': return "\\";
        case 't': return "\t";
        // some control character we don't know how to handle
        default: return m.ToString();
    }
}
于 2008-09-22T15:58:44.087 回答
0

我会在这里使用默认的 TextBlock 控件作为参考。在该控件中,您可以像这样进行换行:

    <TextBlock>
        Line 1
        <LineBreak />
        Line 2
    </TextBlock>

通过将控件的内容值设置为文本属性,您应该能够对控件执行类似的操作。

于 2008-09-22T16:00:59.543 回答