2008-09-22 11 views
3

Supposons que j'ai quelques XAML comme ceci:WPF et le formatage de chaîne

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

Il est évident que je veux un retour à la ligne dans la propriété MyClass.Text, mais l'analyseur XAML construit l'objet avec la chaîne « foo \ nbar ". Existe-t-il (a) un moyen de convaincre l'analyseur de traduire des séquences d'échappement, ou (b) une méthode .NET pour interpréter une chaîne comme le ferait le compilateur C#?

Je me rends compte que je peux y aller en cherchant des séquences \n, mais il serait plus agréable d'avoir une façon générique de le faire.

Répondre

12

Vous pouvez utiliser le caractère XML échapper

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

Je pense que plusieurs des réponses fonctionnerait, mais cela est certainement la solution la plus simple. Merci à tous. – chrisd

1

Sur le dessus de ma tête, essayez;

  1. Une expression de liaison personnalisée peut-être?

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

  1. Utilisez une chaîne ressource statique?

  2. Faire de Text la propriété par défaut de votre contrôle et;

<v:MyClass x:Key="whatever"> 
foo 
bar 
</v:MyClass> 
1

Je me rends compte que je peux aller chercher là-bas pour \ n séquences, [...]

Si tout ce que vous aimez est \ n de, alors vous pourriez essayer quelque chose comme:

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

Ou, fo r b) puisque je ne connais pas et ne peut pas trouver une fonction builtin pour ce faire, quelque chose comme:

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

Je voudrais utiliser le contrôle par défaut TextBlock comme référence ici. Dans ce contrôle, vous faites des sauts de ligne comme ceci:

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

Vous devriez être en mesure de faire quelque chose de similaire avec votre commande en faisant la valeur du contenu de votre contrôle soit la propriété de texte.