Предположим, у меня есть такой XAML:
<Window.Resources>
<v:MyClass x:Key = "whatever" Text = "foo\nbar" />
</Window.Resources>
Очевидно, мне нужен символ новой строки в свойстве MyClass.Text, но синтаксический анализатор XAML конструирует объект с буквальной строкой «foo \ nbar».
Есть ли (а) способ убедить синтаксический анализатор перевести escape-последовательности или (б) метод .NET для интерпретации строки так, как это сделал бы компилятор C#?
Я понимаю, что могу пойти туда и поискать последовательности \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>
Вы должны иметь возможность сделать что-то подобное с вашим элементом управления, сделав значение содержимого вашего элемента управления свойством text.
Вы можете использовать экранирование символов XML
<TextBlock Text = "Hello World!"/>
Я думаю, что несколько ответов подойдут, но это, безусловно, самое простое решение. Спасибо всем.