Leggere e scrivere XAML con il .NET Framework 4.0

di Cristian Civera, in Windows Presentation Foundation, .NET Framework,

L'eXtensible Application Markup Language (XAML) è un linguaggio che deriva da XML e ha trovato il suo primo impiego con Windows Presentation Foundation per la definizione del layout e dell'interfaccia delle applicazioni windows.

In realtà lo scopo di questo linguaggio va ben oltre, perché permette in modo dichiarativo di istanziare oggetti, impostare proprietà e popolare collezioni, il tutto con una sintassi di facile comprensione per l'uomo e per il software che deve manipolarlo o interpretarlo. Ne sono un esempio i file con estensione xamlx, usati per la definizione dei workflow.

Data la sua natura variabile e indipendente da WPF, nel .NET Framework allo XAML è stato dedicato un assembly apposito, di nome System.Xaml, che contiene le classi per leggere e scrivere l'infoset XAML. Per infoset si intende la struttura fatta di dichiarazione dei namespace, dei membri e delle proprietà indipendentemente dal formato di memorizzazione, il quale può essere testuale, binario (baml) o direttamente istanze di oggetti .NET.

Il formato binario viene utilizzato da WPF per rendere più piccole le risorse e per ottimizzare il processo di caricamento del markup. Viene quindi incluso nell'assembly e per caricarlo occorre prima di tutto cercarlo all'interno dell'eseguibile:

Assembly asm = Assembly.LoadFile(@"MyWpfApp.exe");
  
using (Stream stream = asm.GetManifestResourceStream("MyWpfApp.g.resources"))
{
  // Ricerco la risorsa BAML nell'assembly
  ResourceReader reader = new ResourceReader(stream);
  foreach (DictionaryEntry entry in reader)
  {
    if (String.Compare(Path.GetExtension(entry.Key.ToString()), ".baml", true) == 0 && entry.Value is Stream)
    {
      Parse(entry.Value as Stream);
    }
  }
}

Ottenuto il riferimento allo Stream è possibile sfruttare una delle implementazioni di XamlReader, in questo caso il Baml2006Reader, per sfogliare gli elementi. Per scrivere è possibile usare una delle implementazioni di XamlWriter, delle quali più utile è sicuramente lo XamlXmlWriter. Infine, attraverso la classe XamlServices si ha a disposizione molteplici metodi rapidi per leggere e scrivere XAML. Tra questi il metodo Transform prende un reader e chiama il writer per ogni tipologia di nodo, permettendo di fare transformazioni da oggetti/markup verso oggetti/markup. Ecco quindi come leggere il baml e convertirlo in XML.

void Parse(Stream baml)
{
  using (System.Xaml.XamlReader reader = new Baml2006Reader(baml))
  {
    using (XamlXmlWriter xamlWriter = new XamlXmlWriter(Console.Out, reader.SchemaContext))
    {
      XamlServices.Transform(reader, xamlWriter, false);
    }
  }
}

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

Nessuna risorsa collegata

I più letti di oggi