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
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
- Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
- Creare una libreria CSS universale: Cards
- Eseguire script pre e post esecuzione di un workflow di GitHub