Elaborazione degli spazi vuoti in XAML
Aggiornamento: novembre 2007
Le regole del linguaggio Extensible Application Markup Language (XAML) definiscono la modalità di elaborazione degli spazi vuoti significativi tramite l'implementazione di un processore XAML. In questo argomento vengono illustrate tali regole di linguaggio, nonché la gestione degli spazi vuoti aggiuntivi definita dall'implementazione Windows Presentation Foundation (WPF) del processore XAML e del writer XAML per la serializzazione.
Elaborazione degli spazi vuoti
Definizione di spazio vuoto
Coerentemente con XML, gli spazi vuoti in XAML sono costituiti da spazi e caratteri di avanzamento riga e di tabulazione. Questi corrispondono rispettivamente ai valori Unicode 0020, 000A e 0009.
Normalizzazione degli spazi vuoti
Per impostazione predefinita, quando un processore XAML elabora un file XAML, viene eseguita la normalizzazione degli spazi vuoti come illustrato di seguito:
I caratteri di avanzamento riga inseriti tra i caratteri dell'Asia orientale vengono rimossi. Per una definizione di "caratteri dell'Asia orientale" vedere la sezione Caratteri dell'Asia orientale riportata in seguito in questo argomento.
Tutti gli spazi vuoti (spazi, avanzamento riga, tabulazioni) vengono convertiti in spazi.
Tutti gli spazi consecutivi vengono eliminati e sostituiti da un unico spazio.
Uno spazio immediatamente successivo al tag di inizio viene eliminato.
Uno spazio immediatamente precedente al tag di fine viene eliminato.
L'"impostazione predefinita" corrisponde allo stato indicato dal valore predefinito dell'attributo xml:space.
Spazi vuoti nel testo interno e primitive di stringa
Le regole di normalizzazione descritte in precedenza si applicano al testo interno degli elementi XAML. Dopo la normalizzazione, un processore XAML convertirà qualsiasi testo interno in un tipo appropriato come illustrato di seguito:
Se il tipo della proprietà non è un insieme, ma non è nemmeno un tipo Object, il processore XAML tenta di eseguire la conversione a quel tipo utilizzando il convertitore dei tipi. Una conversione non riuscita comporterà in questo caso un errore in fase di compilazione.
Se il tipo della proprietà è un insieme e il testo interno è contiguo (non sono frapposti tag di elementi), il testo interno viene analizzato come singolo oggetto String. Se il tipo di insieme non accetta String, anche in questo caso si verificherà un errore in fase di compilazione.
Se il tipo della proprietà è Object, il testo interno sarà analizzato come singolo oggetto String. Se sono frapposti tag di elementi, sarà generato un errore in fase di compilazione, in quanto il tipo Object implica un solo oggetto (String o diverso).
Se il tipo della proprietà è un insieme e il testo interno non è contiguo, la prima sottostringa sarà convertita in un oggetto String e aggiunta come elemento dell'insieme. Quindi l'elemento frapposto sarà aggiunto come elemento dell'insieme e infine la sottostringa finale (se presente) verrà aggiunta all'insieme come terzo elemento String.
Spazi vuoti e modelli di contenuto del testo
In pratica, la conservazione degli spazi vuoti riguarda solo un sottoinsieme di tutti i possibili modelli di contenuto. Tale sottoinsieme è composto dai modelli di contenuto che accettano un tipo String Singleton in una determinata forma, un insieme String dedicato o una combinazione di String e di altri tipi in un insieme IList o ICollection<T>.
Anche per i modelli di contenuto che accettano le stringhe, il comportamento predefinito all'interno di tali modelli prevede che tutti gli spazi vuoti rimanenti non siano trattati come significativi. Ad esempio, ListBox accetta un oggetto IList, ma gli spazi vuoti (ad esempio i caratteri di avanzamento riga tra ogni ListBoxItem) non vengono conservati, né sottoposti a rendering. Difatti, il tentativo di utilizzare i caratteri di avanzamento riga come separatori di stringhe per gli elementi ListBoxItem non funziona; le stringhe separate tramite caratteri di avanzamento riga vengono trattate come un'unica stringa e un unico elemento.
Gli insiemi che trattano gli spazi vuoti come significativi sono in genere parte del modello di documento dinamico. L'insieme primario che supporta il comportamento di mantenimento degli spazi vuoti è InlineCollection. Questa classe di insiemi viene dichiarata con WhitespaceSignificantCollectionAttribute; una volta trovato questo attributo, il processore XAML tratterà gli spazi vuoti all'interno dell'insieme come significativi. La combinazione di xml:space="preserve" e spazi vuoti all'interno di un insieme denotato WhitespaceSignificantCollectionAttribute implica che TUTTI gli spazi vuoti vengano mantenuti e sottoposti a rendering. La combinazione di xml:space="default" e spazi vuoti all'interno di un oggetto WhitespaceSignificantCollectionAttribute comporterà la normalizzazione degli spazi vuoti iniziali descritta in precedenza, mediante la quale verrà mantenuto uno spazio vuoto in determinate posizioni e questi spazi vuoti saranno conservati e sottoposti al rendering. Sarà l'utente a decidere il comportamento più appropriato e a utilizzare xml:space in maniera selettiva per attivare il comportamento desiderato.
Inoltre, determinati elementi inline che implicano un'interruzione di riga in un modello di documento dinamico devono evitare l'introduzione di uno spazio aggiuntivo persino in un insieme significativo di spazi vuoti. L'elemento LineBreak, ad esempio, ha la stessa funzione del tag <BR/> in HTML e in genere, per migliorare la leggibilità del markup, un oggetto LineBreak è separato dal testo successivo tramite la creazione di un carattere di avanzamento riga. Tale avanzamento riga non deve essere normalizzato per l'utilizzo come spazio iniziale nella riga successiva. Per attivare questo comportamento, alla definizione della classe per l'elemento LineBreak viene applicato l'oggetto TrimSurroundingWhitespaceAttribute, che viene quindi interpretato dal processore XAML per indicare che quello spazio vuoto che circonda LineBreak sarà sempre tagliato.
Conservazione degli spazi vuoti
Esistono diverse tecniche per conservare gli spazi vuoti nell'XAML di origine non soggetti alla normalizzazione degli spazi vuoti del processore XAML per un'eventuale presentazione.
xml:space = "preserve": specificare questo attributo al livello dell'elemento in cui si desidera conservare gli spazi vuoti. In questo modo saranno mantenuti tutti gli spazi vuoti, compresi quelli che potrebbero essere aggiunti dalle applicazioni di modifica del codice per allineare gli elementi in modo ottimale, come nidificazione visivamente intuitiva; tuttavia, il rendering di tali spazi dipende ancora una volta dal modello di contenuto per l'elemento contenitore. Non è opportuno specificare xml:space="preserve" al livello radice, perché la maggior parte dei modelli a oggetti, in un modo o in un altro, non considera gli spazi vuoti come significativi. Si consiglia piuttosto di impostare l'attributo specificamente al livello degli elementi che eseguono il rendering degli spazi vuoti all'interno delle stringhe o che costituiscono insiemi significativi di spazi vuoti.
Entità e spazi unificatori: XAML supporta il posizionamento di qualsiasi entità Unicode all'interno di un modello di testo a oggetti. È possibile utilizzare entità dedicate quali gli spazi unificatori (& #160; nella codifica UTF-8). È inoltre possibile utilizzare i controlli rich text che supportano caratteri spazio unificatore. È necessario prestare molta attenzione se si utilizzano entità per simulare le caratteristiche di layout, ad esempio il rientro, in quanto l'output di runtime delle entità varierà in base a un maggior numero di fattori rispetto alle funzionalità di layout generali (quale l'utilizzo corretto di pannelli e margini). Ad esempio, viene eseguito il mapping delle entità ai tipi di carattere, pertanto le dimensioni possono cambiare in funzione della selezione del tipo di carattere operata dall'utente.
Caratteri dell'Asia orientale
I "caratteri dell'Asia orientale" vengono definiti come un insieme di intervalli di caratteri Unicode compresi tra U+20000 e U+2FFFD e tra U+30000 a U+3FFFD. Questo sottoinsieme talvolta è denominato anche "ideogrammi CJK". Per ulteriori informazioni, vedere http://www.unicode.org (informazioni in lingua inglese).