Elaborazione di spazi vuoti in XAML
Le regole del linguaggio per lo stato XAML che lo spazio vuoto significativo deve essere elaborato da un'implementazione del processore XAML. Questo articolo documenta queste regole del linguaggio XAML. Documenta inoltre una gestione aggiuntiva degli spazi vuoti definita dall'implementazione di Windows Presentation Foundation (WPF) del processore XAML e del writer XAML per la serializzazione.
Definizione di spazi vuoti
Coerente con XML, gli spazi vuoti in XAML sono spazi, avanzamenti riga e tabulazioni. Questi valori corrispondono rispettivamente ai valori Unicode 0020, 000A e 0009.
Normalizzazione degli spazi vuoti
Per impostazione predefinita, la normalizzazione degli spazi vuoti seguente si verifica quando un processore XAML elabora un file XAML:
I caratteri di avanzamento riga tra i caratteri dell'Asia orientale vengono rimossi. Per una definizione di questo termine, vedere la sezione "Caratteri dell'Asia orientale" più avanti in questo argomento.
Tutti gli spazi vuoti (spazio, avanzamento riga, tabulazioni) vengono convertiti in spazi.
Tutti gli spazi consecutivi vengono eliminati e sostituiti da uno spazio.
Uno spazio immediatamente successivo al tag iniziale viene eliminato.
Spazio immediatamente prima dell'eliminazione del tag di fine.
"Default" corrisponde allo stato indicato dal valore predefinito dell'attributo xml:space.
Spazi vuoti nelle primitive di testo interno e 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 indicato di seguito:
Se il tipo della proprietà non è una raccolta ma non è direttamente un tipo di Object, il processore XAML tenta di eseguire la conversione in tale tipo usando il convertitore di tipi. Una conversione non riuscita in questo caso causa un errore in fase di compilazione.
Se il tipo della proprietà è una raccolta e il testo interno è contiguo (nessun tag di elemento intermedio), il testo interno viene analizzato come un singolo String. Se il tipo di raccolta non può accettare String, viene generato anche un errore in fase di compilazione.
Se il tipo della proprietà è Object, il testo interno viene analizzato come singolo String. Se sono presenti tag di elemento intermedi, viene generato un errore in fase di compilazione perché il tipo di Object implica un singolo oggetto (String o in altro modo).
Se il tipo della proprietà è una raccolta e il testo interno non è contiguo, la prima sottostringa viene convertita in un String e aggiunta come elemento della raccolta, l'elemento intermedio viene aggiunto come elemento della raccolta e infine la sottostringa finale (se presente) viene aggiunta alla raccolta come terzo elemento String.
Mantenimento dello spazio vuoto
Esistono diverse tecniche per mantenere lo spazio vuoto nel codice XAML di origine per la presentazione finale che non sono interessate dalla normalizzazione dello spazio vuoto del processore XAML.
xml:space="preserve": specificare questo attributo al livello dell'elemento in cui si desidera conservare gli spazi vuoti. In questo modo vengono mantenuti tutti gli spazi vuoti, che includono gli spazi che potrebbero essere aggiunti dalle applicazioni di modifica del codice agli elementi "pretty-print" allineano gli elementi come annidamento visivamente intuitivo. Tuttavia, se il rendering di tali spazi è determinato dal modello di contenuto per l'elemento contenitore. Evitare di specificare xml:space="preserve"
a livello radice perché la maggior parte dei modelli a oggetti non considera lo spazio vuoto significativo indipendentemente dalla modalità di impostazione dell'attributo. L'impostazione di xml:space
a livello globale può avere conseguenze sulle prestazioni dell'elaborazione XAML (in particolare la serializzazione) in alcune implementazioni. È consigliabile impostare l'attributo in modo specifico a livello di elementi che eseguono il rendering di spazi vuoti all'interno di stringhe o sono raccolte significative di spazi vuoti.
Entità e spazi non di rilievo: XAML supporta l'inserimento di qualsiasi entità Unicode all'interno di un modello a oggetti di testo. È possibile usare entità dedicate come lo spazio non interrotto ( nella codifica UTF-8). È anche possibile usare controlli RTF che supportano caratteri di spazio non di interruzione. È consigliabile prestare attenzione se si usano entità per simulare caratteristiche di layout come l'indenzione, perché l'output in fase di esecuzione delle entità varia in base a un numero maggiore di fattori rispetto alle funzionalità per la produzione di risultati di indention in un sistema di layout tipico, ad esempio l'uso corretto di pannelli e margini. Ad esempio, le entità vengono mappate ai tipi di carattere e possono modificare le dimensioni in risposta alla selezione dei tipi di carattere dell'utente.
Caratteri asiatici orientali
"Caratteri asiatici" è definito come un set di intervalli di caratteri Unicode da U+20000 a U+2FFFD e U+30000 a U+3FFFD. Questo subset viene talvolta definito anche "CJK ideographs". Per altre informazioni, vedere https://www.unicode.org.
Spazi vuoti e modelli di contenuto di testo
In pratica, il mantenimento degli spazi vuoti riguarda solo un subset di tutti i modelli di contenuto possibili. Tale subset è costituito da modelli di contenuto che possono accettare un tipo singleton String in qualche forma, una raccolta di String dedicata o una combinazione di String e altri tipi in una raccolta IList o ICollection<T>.
Spazi vuoti e modelli di contenuto di testo in WPF
A scopo illustrativo, la parte restante di questa sezione fa riferimento a tipi specifici definiti da WPF. Le funzionalità di gestione degli spazi vuoti descritte in questo articolo sono pertinenti sia ai servizi XAML .NET che a WPF. Per visualizzare questo comportamento in azione, potresti sperimentare con un markup XAML WPF, visualizzare i risultati in un oggetto grafico e quindi serializzare nuovamente nel markup.
Anche per i modelli di contenuto che possono accettare stringhe, il comportamento predefinito all'interno di questi modelli di contenuto è che qualsiasi spazio vuoto che rimane non viene considerato significativo. Ad esempio, ListBox accetta un IList, ma lo spazio vuoto (ad esempio i avanzamenti di riga tra ogni ListBoxItem) non viene mantenuto e non sottoposto a rendering. Se si tenta di usare gli avanzamenti di riga come separatori tra stringhe per ListBoxItem elementi, non funziona affatto; Le stringhe separate dagli avanzamenti riga vengono considerate come una stringa e un elemento.
Le raccolte che gestiscono lo spazio vuoto come significative sono in genere parte del modello di documento di flusso. La raccolta primaria che supporta il comportamento di conservazione dello spazio vuoto è InlineCollection. Questa classe di raccolta viene dichiarata con il WhitespaceSignificantCollectionAttribute; quando questo attributo viene trovato, il processore XAML considererà gli spazi vuoti all'interno della raccolta come significativi. La combinazione di xml:space="preserve"
e spazi vuoti all'interno di un insieme WhitespaceSignificantCollectionAttribute indicato è che tutto lo spazio vuoto viene mantenuto e sottoposto a rendering. La combinazione di xml:space="default"
e spazi vuoti all'interno di un WhitespaceSignificantCollectionAttribute causa la normalizzazione iniziale degli spazi vuoti descritta in precedenza, che lascia uno spazio in determinate posizioni e tali spazi vengono mantenuti e sottoposti a rendering. Quale comportamento è auspicabile è l'utente e è consigliabile usare xml:space
in modo selettivo per abilitare il comportamento desiderato.
Inoltre, alcuni elementi inline che indicano un'interruzione di riga in un modello di documento di flusso non devono introdurre deliberatamente uno spazio aggiuntivo anche in una raccolta significativa di spazi vuoti. Ad esempio, l'elemento LineBreak ha lo stesso scopo del tag <BR/> in HTML e per la leggibilità nel markup, in genere un LineBreak è separato da qualsiasi testo successivo da un avanzamento riga creato. Tale avanzamento riga non deve essere normalizzato per diventare uno spazio iniziale nella riga successiva. Per abilitare tale comportamento, la definizione della classe per l'elemento LineBreak applica il TrimSurroundingWhitespaceAttribute, che viene quindi interpretato dal processore XAML per indicare che lo spazio vuoto circostante LineBreak viene sempre tagliato.
Vedere anche
- panoramica XAML (WPF .NET)
- entità carattere XML e XAML
- la gestione di xml:space in xaml
.NET Desktop feedback