Nel forum WPF di VB T&T si è parlato oggi di come sfruttare gli XML literals di Visual Basic 2008 per definire dei controlli sotto forma di XElement per poi esportarli come XAML ed utilizzarli nell’interfaccia. Circa un anno fa(!) parlammo, in questo post, di come fare una cosa del genere salvando però il file .Xaml su disco e poi ricaricandolo.
In realtà possiamo definire un controllo da codice anche senza passare da file esterni. Tipicamente questo scenario si ha quando si vogliono generare controlli in modo dinamico a run-time, quindi vi rimando al precedente post per informazioni sull’utilizzo delle embedded expression che ci consentono di fare questa operazione. In questa sede ci interessa in modo particolare capire come utilizzare il parsing dello XAML.
Supponiamo di avere un Button definito tramite gli XML Literals ed assegnato a un oggetto XElement, in questo modo:
Dim testControl = <Button Width="100" Height="50" Name="Button1">Test</Button>
Per convertirlo in un controllo WPF utilizzabile nell’applicazione, è necessario che l’XML sia interpretato come XAML. Per fare questo, è necessario importare i namespace Xml di WPF che fanno sì che l’XML contenuto nel nostro XElement possa essere confrontato con gli schemi propri di WPF:
Imports <xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
Imports <xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
Ora possiamo scrivere la seguente riga, che fa proprio ciò che ci occorre:
Dim myButton = CType(System.Windows.Markup.XamlReader.Parse(testControl.ToString), Button)
In particolare, il metodo statico XamlReader.Parse analizza una stringa (per tale motivo il contenuto del nostro XElement viene convertito in String) e restituisce il corrispondente XAML sotto forma di Object. Poiché sappiamo a priori che si tratta di un Button, eseguiamo anche la conversione.
A questo punto possiamo aggiungere il controllo all’interfaccia, per esempio in questo modo:
Me.Grid1.Children.Add(myButton)
Eventualmente potremmo utilizzare delle istruzioni AddHandler per attivare la gestione degli eventi che ci interessano.
Alessandro