WPF和字符串格式

时间:2020-03-06 14:32:40  来源:igfitidea点击:

假设我有一些这样的XAML:

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

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

是否有(a)一种使脚本解析器转换转义序列的方法,或者(b)一种.NET方法以Ccompiler的方式解释字符串?

我意识到我可以去那里寻找\ n序列,但是最好有一种通用的方式来做到这一点。

解决方案

从我的头顶上尝试;

  • 定制绑定表达式?
<v:MyClass x:Key="whatever" Text="{MyBinder foo\nbar}"/>
  • 使用字符串静态资源?
  • 使Text为控件的默认属性;以及
<v:MyClass x:Key="whatever">
foo
bar
</v:MyClass>

I realize that I can go in there looking for \n sequences, [...]

如果我们只关心\ 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();
    }
}

我将在此处使用默认的TextBlock控件作为参考。在该控件中,我们可以像这样进行换行:

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

通过使控件的content值为text属性,我们应该能够对控件执行类似的操作。

我们可以使用XML字符转义

<TextBlock Text="Hello&#13;World!"/>