Caricare o salvare markup XAML a runtime

di Cristian Civera, in Windows Presentation Foundation,

Alcune applicazioni WPF possono richiedere di dover generare contenuti in modo dinamico, in base a dati provenienti dalle più disparate fonti, tipo XML o trasformazioni XSLT. Normalmente è possibile creare controlli e pannelli da codice, ma questa pratica non è molto comoda se si devono creare layout complessi. Risulta più comodo preparare del codice XAML a runtime, mediante un template, e una volta preparato il markup occorre parserizzarlo e crearne un albero di oggetti.

La classe XamlReader (namespace System.Windows.Markup) dispone di un metodo statico in grado di eseguire questa operazione. Ecco un semplice esempio d'utilizzo che crea una TextBlock:

using (XmlReader reader = XmlReader.Create(new StringReader("<TextBlock Text=\"Testo\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" />")))
{
    tb = (TextBlock)XamlReader.Load(reader);
}

E' importante ricordare il namespace, perché il parser è un motore che sta al di sopra di WPF e può essere usato anche per altri scopi. Inoltre va sottolineato che le performance di questa tecnica non sono eccelse, perché il processamento del markup è dispendioso e differisce dal BAML creato in fase di compilazione, più ottimizzato per il caricamento a runtime. In caso di tempi lunghi, è possibile sfruttare il metodo LoadAsync che esegue l'operazione in asincrono e l'evento LoadCompleted per conoscere quando ha terminato.

Contrariamente, è possibile generare markup XAML da qualsiasi oggetto utilizzando la classe XamlWriter. Di seguito l'operazione contraria all'esempio precedente.

TextBlock tb = new TextBlock();
tb.Text = "Testo";

string xaml = XamlWriter.Save(tb);

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi