Architettura del parser XAML
In WPF Designer per Visual Studio vengono caricati documenti XAML (Extensible Application Markup Language) e vengono creati oggetti WPF da visualizzare in Visual Studio. Gli errori riscontrati durante il caricamento vengono visualizzati nella finestra Elenco errori.
Fasi di caricamento di XAML
In WPF Designer viene caricato un documento XAML e viene creata una corrispondente struttura ad albero sintattica astratta, ovvero una struttura di dati che rappresenta il file XAML analizzato. Si tratta di una struttura ad albero limitata, etichettata e orientata in cui i nodi interni sono identificati da operatori e i nodi foglia rappresentano gli operandi degli operatori nodo. I nodi foglia includono operatori senza argomenti, che sono variabili o costanti.
Il caricamento di un documento XAML si verifica in una serie di fasi, come illustrato nella tabella seguente.
Fase di caricamento di XAML |
Descrizione |
---|---|
Verifica della sintassi XML |
Scanner: passaggio lessicale in cui viene verificata la presenza di formati non corretti e di caratteri non validi e vengono creati i token lessicali. Parser: viene creata la struttura ad albero sintattica astratta e viene eseguita l'analisi delle coppie per verificare la correttezza e l'esatta corrispondenza dei tag. |
Verifica della sintassi XAML |
ConvertToXaml ricerca tutti i tipi, inserisce le informazioni sui tipi nella struttura ad albero sintattica astratta XAML e vi aggiunge annotazioni. Validate esegue il controllo degli errori e verifica le posizioni dei nodi nella struttura ad albero. |
Creazione di istanze di modelli e oggetti |
Fase discreta con un'analisi distinta della struttura ad albero sintattica astratta, tramite cui vengono creati il modello di modifica e gli oggetti WPF. |
I nodi in cui nelle fasi precedenti si sono verificati errori sono contrassegnati come errati e non vengono controllati di nuovo durante le fasi successive. Se vengono riscontrati errori durante le fasi di scanner e parser, non viene eseguito il tentativo di completare la fase di creazione di istanze di modelli e oggetti.
Verifica della sintassi XML
Durante le fasi di scanner e parser viene verificato che il documento da caricare sia un documento XML ben formato che non contiene errori di sintassi XML. Un errore di sintassi XML è ad esempio un tag <Button> senza un corrispondente tag </Button> di fine. Poiché il parser tenta il recupero dagli errori, è possibile che vengano segnalati più errori dopo un singolo tentativo di analisi del documento.
Verifica della sintassi XAML
Il parser attraversa la struttura ad albero sintattica astratta XML in passaggi distinti per verificare che il documento sia un documento XAML valido, ovvero che sia conforme allo schema XML XAML e che non contenga errori XAML. Un errore XAML è ad esempio un elemento che utilizza dichiarazioni di proprietà non valide, quale <Button SomeProperty="Mark">.
Questi passaggi includono la risoluzione del tipo, in modo che sia possibile convalidare informazioni quali i nomi di elementi e i nomi di proprietà in base al tipo di elemento. Ad esempio, il parser controlla se SomeProperty è una proprietà di Button. I tipi mancanti generano errori.
Poiché il parser tenta il recupero dagli errori, è possibile che vengano segnalati più errori dopo un singolo tentativo di analisi del documento. Tuttavia, non vengono segnalati tutti gli errori possibili. Ad esempio, se il nome di un elemento e il nome della proprietà al suo interno sono scritti in modo errato, inizialmente verrà segnalato solo l'errore dell'elemento, perché i nomi delle proprietà possono essere convalidati solo dopo la risoluzione corretta dell'elemento.
Nota
Questa fase non include la convalida dei valori di proprietà. Ad esempio, <Button Background="xBlue"/> non viene rilevato durante questa fase. Vedere la descrizione riportata più avanti in questo argomento.
Creazione di istanze di modelli e oggetti
Alla fine della verifica della sintassi, è disponibile una struttura ad albero sintattica astratta che corrisponde al file XAML contenente una struttura ad albero del documento specifico XAML che funge da visualizzazione o cursore all'interno di tale struttura.
Nell'ultima fase vengono create istanze del modello e delle istanze sottostanti e i valori di proprietà vengono convertiti da stringhe e assegnati. A tale scopo il parser crea una struttura ad albero del documento utilizzando una classe del gestore della struttura ad albero del documento. Quando viene creata la struttura ad albero del documento per XAML, vengono create anche le istanze WPF sottostanti, che vengono utilizzate come visualizzazione nella finestra di progettazione.
Se viene generata un'eccezione dopo la creazione del modello e delle istanze, la creazione di oggetti per i nodi figlio del nodo in cui si è verificato l'errore non viene completata. Il modello viene costruito per la parte rimanente della struttura ad albero, esponendo il numero maggiore possibile degli errori.
Ad esempio, nel frammento di codice <Button Background="Test"/> l'oggetto TypeConverter per il tipo Brush tenta di convertire Test in un'istanza di Brush. Poiché Test non è un valore valido di Brush, il convertitore di tipi genera un'eccezione che interrompe il processo di analisi per i nodi figlio, ma non influisce sull'analisi del resto del documento.
I valori delle proprietà vengono convertiti da stringhe dopo la creazione dell'istanza dell'oggetto proprietario. Ciò si verifica quando l'oggetto proprietario viene utilizzato nell'area di progettazione. Molti errori relativi a intervalli di valori vengono segnalati solo quando l'oggetto padre viene utilizzato dalla finestra di progettazione.
Questo comportamento è simile alla compilazione WPF. Il generatore WPF non convalida né tenta di convertire i valori di attributo (proprietà) durante la compilazione. I convertitori di tipi vengono chiamati solo dopo la creazione di un'istanza della struttura ad albero degli oggetti tramite WPF in fase di esecuzione.
Nota
Per il caricamento di dizionari di risorse esterni, esiste un'interazione tra il modello di modifica e il parser. Quando il modello di modifica deve caricare file XAML aggiuntivi, attiva un'operazione di caricamento di XAML.
Messaggi di errore
Nell'argomento della Guida relativo ai messaggi di errore di WPF Designer viene descritta la fase di caricamento di XAML che ha generato l'errore. Nella tabella seguente è mostrata la corrispondenza tra messaggi e fasi.
Fase di caricamento di XAML |
Messaggio di errore |
---|---|
Verifica della sintassi XML |
Questo errore viene generato quando il file XAML non è un documento XML ben formato. |
Verifica della sintassi XAML |
Questo errore viene generato quando il file è un documento XML valido, ma non è un documento XAML ben formato. |
Creazione di istanze di modelli e oggetti |
Questo errore viene generato quando il file è un documento XAML ben formato, ma contiene uno o più tipi non corrispondenti. |