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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.