4

次のような XAML があるとします。

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

明らかに、MyClass.Text プロパティに改行文字が必要ですが、XAML パーサーは、リテラル文字列 "foo\nbar" を使用してオブジェクトを構築します。

(a) パーサーにエスケープ シーケンスを変換させる方法、または (b) C# コンパイラのように文字列を解釈する .NET メソッドはありますか?

シーケンスを探してそこに行くことができること\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>

コントロールのコンテンツ値をtextプロパティにすることで、コントロールと同様のことができるはずです。

于 2008-09-22T16:00:59.543 に答える