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.
Approfondimenti
I più letti di oggi
- #IE10 disponibile al download da subito: http://aspitalia.com/vf http://aspitalia.com/mix-11 #mix11
- #ie10 supporta il multitouch anche in #Javascript. http://aspitalia.com/build-win8 #BldWin
- stiamo per partire con #aspilive .NET Serverless Day, con @dbochicchio, @cristiancivera e @kasukenhttps://aspit.co/ServerlessDay #azure #aws #serverless #dotnet
- vuoi costruire applicazioni web in real time? non perdere il nostro speciale! https://aspit.co/aln #signalr #websockets #polling #aspnet
- finiamo con @itsonlyGianca e #Windows10 iot core e #raspberrypi2 con #VS2015 su #aspilive: https://aspit.co/VS2015-live
- #Windows10 #iot core è ora disponibile al download per #RaspberryPI2 e #MinnowBoardMAX: https://aspit.co/a6a