Все таки Xaml – это полезная вещь. Я написал коротенькую функцию, с помощью которой можно задавать содержимое TextBlock’ов с помощью xaml кода. Это нужно, когда содержимое нужно менять походу выполнения программы. Например, написав:
SetInlines(MyCuteTextBlock, "Крутой текст с <Bold>выделениями</Bold>, переносами строк,<LineBreak/><Underline>подчеркиваниями</Underline> и тому подобными стильными вещицами.");
получаем следующий результат:
А добиться такой простой записи позволяет простая функция:
using System.IO;
using System.Windows.Markup;
using System.Xml;
using System.Windows.Markup;
using System.Xml;
//Create inlines from xaml string
private void SetInlines(TextBlock tb, string XamlCode)
{
string Op = "<TextBlock xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">";
string Ed = "</TextBlock>";
StringReader stringReader = new StringReader(Op + XamlCode + Ed);
XmlReader xmlReader = XmlReader.Create(stringReader);
TextBlock TempTB = (TextBlock)XamlReader.Load(xmlReader);
//Lets copy inlines
tb.Inlines.Clear();
List<Inline> inls = new List<Inline>(TempTB.Inlines);
foreach (Inline nl in inls)
tb.Inlines.Add(nl);
}
private void SetInlines(TextBlock tb, string XamlCode)
{
string Op = "<TextBlock xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">";
string Ed = "</TextBlock>";
StringReader stringReader = new StringReader(Op + XamlCode + Ed);
XmlReader xmlReader = XmlReader.Create(stringReader);
TextBlock TempTB = (TextBlock)XamlReader.Load(xmlReader);
//Lets copy inlines
tb.Inlines.Clear();
List<Inline> inls = new List<Inline>(TempTB.Inlines);
foreach (Inline nl in inls)
tb.Inlines.Add(nl);
}
Здесь используется класс XamlReader, который позволяет парсить XAML динамически, то есть уже на этапе исполнения программы.