WPF y formato de cadenas
Pregunta
Supongamos que tengo algo de XAML como este:
<Window.Resources>
<v:MyClass x:Key="whatever" Text="foo\nbar" />
</Window.Resources>
Obviamente quiero un carácter de nueva línea en la propiedad MyClass.Text, pero el analizador XAML construye el objeto con la cadena literal "foo bar".
¿Existe (a) una manera de convencer al analizador de que traduzca secuencias de escape, o (b) un método .NET para interpretar una cadena como lo haría el compilador de C#?
Me doy cuenta de que puedo entrar allí buscando \n
secuencias, pero sería mejor tener una forma genérica de hacer esto.
Solución
Puedes utilizar el escape de caracteres XML.
<TextBlock Text="Hello World!"/>
Otros consejos
Fuera de mi cabeza, inténtalo;
- ¿Quizás una expresión vinculante personalizada?
<v:MyClass x:Key="whatever" Text="{MyBinder foo\nbar}"/>
¿Utiliza un recurso estático de cadena?
Haga que Texto sea la propiedad predeterminada de su control y;
<v:MyClass x:Key="whatever"> foo bar </v:MyClass>
Me doy cuenta de que puedo entrar buscando secuencias, [...]
Si lo único que te importa son los , entonces puedes probar algo como:
string s = "foo\\nbar";
s = s.Replace("\\n", "\n");
O, para b) ya que no conozco y no puedo encontrar una función incorporada para hacer esto, algo como:
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();
}
}
Yo usaría el control TextBlock predeterminado como referencia aquí.En ese control haces saltos de línea así:
<TextBlock>
Line 1
<LineBreak />
Line 2
</TextBlock>
Debería poder hacer algo similar con su control haciendo que el valor del contenido de su control sea la propiedad del texto.