Elaborazione degli spazi vuoti in XAML

Le regole del linguaggio per XAML definiscono la modalità di elaborazione degli spazi vuoti significativi tramite l'implementazione di un processore XAML. In questo argomento vengono illustrate le regole del linguaggio XAML, nonché la gestione degli spazi vuoti aggiuntivi definita dall'implementazione Windows Presentation Foundation (WPF) del processore XAML e del writer XAML per la serializzazione.

Nel presente argomento sono contenute le seguenti sezioni.

  • Definizione di spazio vuoto
  • Normalizzazione degli spazi vuoti
  • Spazi vuoti nel testo interno e primitive di stringa
  • Conservazione degli spazi vuoti
  • Caratteri dell'Asia orientale
  • Spazi vuoti e modelli di contenuto del testo
  • Argomenti correlati

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:

  1. 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 relativa più avanti in questo argomento.

  2. Tutti gli spazi vuoti (spazi, avanzamento riga, tabulazioni) vengono convertiti in spazi.

  3. Tutti gli spazi consecutivi vengono eliminati e sostituiti da un unico spazio.

  4. Uno spazio immediatamente successivo al tag di inizio viene eliminato.

  5. 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 precedenti si applicano al testo interno presente negli elementi XAML. Dopo la normalizzazione, un processore XAML converte 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 causa 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 verifica un errore in fase di compilazione.

  • Se il tipo della proprietà è Object, il testo interno viene analizzato come singolo oggetto String. Se sono frapposti tag di elementi, viene 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 viene 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.

Conservazione degli spazi vuoti

Esistono diverse tecniche che consentono di mantenere gli spazi vuoti nel codice XAML di origine in modo che non siano soggetti alla normalizzazione degli spazi vuoti del processore XAML per la presentazione conclusiva.

xml:space = "preserve": specificare questo attributo al livello dell'elemento in cui si desidera conservare gli spazi vuoti. Vengono così mantenuti tutti gli spazi vuoti, inclusi gli spazi 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. Evitare di specificare xml:space="preserve" al livello radice, perché la maggior parte dei modelli a oggetti non considera gli spazi vuoti come significativi, indipendentemente dalla modalità di impostazione dell'attributo. L'impostazione di xml:space globalmente può avere conseguenze sulle prestazioni dell'elaborazione XAML, in particolare la serializzazione, in alcune implementazioni. 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 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à per ottenere i risultati di rientro in un sistema di layout tipico, ad esempio 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).

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>.

Spazi vuoti e modelli di contenuto del testo in WPF

Per scopo illustrativo, nella restante parte di questa sezione viene fatto riferimento a tipi particolari definiti da WPF. Le funzionalità di gestione degli spazi vuoti descritte in questo argomento sono generalmente pertinenti ai servizi XAML di .NET Framework e a WPF. Per una dimostrazione di questo comportamento, potrebbe essere utile provare a utilizzare parti del markup XAML di WPF, osservare i risultati prodotti in un oggetto grafico, quindi indirizzare di nuovo la serializzazione al markup.

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 IList, ma lo spazio vuoto (ad esempio i caratteri di avanzamento riga tra ogni ListBoxItem) non viene mantenuto e non viene sottoposto a rendering. Se si tenta di utilizzare i caratteri di avanzamento riga come separatori tra le stringhe per elementi ListBoxItem, l'esito sarà negativo; le stringhe separate dai caratteri di avanzamento riga sono considerate come una singola stringa e un singolo 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 spazio vuoto all'interno di un insieme specificato da WhitespaceSignificantCollectionAttribute implica che tutti gli spazi vuoti vengano mantenuti e sottoposti a rendering. La combinazione di xml:space="default" e spazio vuoto all'interno di un oggetto WhitespaceSignificantCollectionAttribute comporta la normalizzazione degli spazi vuoti iniziali descritta in precedenza, mediante la quale viene mantenuto uno spazio vuoto in determinate posizioni e tali spazi sono conservati e sottoposti a rendering. Sarà l'utente a decidere il comportamento più appropriato e a utilizzare xml:space in maniera selettiva per abilitare 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.

Vedere anche

Riferimenti

Entità carattere XML e XAML

Gestione di xml:space in XAML

Concetti

Cenni preliminari su XAML (WPF)