Elaborazione degli 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:

  1. I caratteri di avanzamento riga inseriti tra i caratteri dell'Asia orientale vengono rimossi. Per una definizione dei "caratteri dell'Asia orientale", vedere la sezione relativa più avanti in questo argomento.

  2. Tutti gli spazi vuoti (spazio, 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 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 illustrato di seguito:

  • Se il tipo della proprietà non è una raccolta, ma non è nemmeno un tipo Object , il processore XAML tenta di eseguire la conversione a quel tipo usando il convertitore dei tipi. Una conversione non riuscita causa un errore in fase di compilazione.

  • Se il tipo della proprietà è una raccolta e il testo interno è contiguo, (non sono frapposti tag di elementi), il testo interno viene analizzato come singolo oggetto String. Se il tipo di raccolta 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 un 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à è una raccolta e il testo interno non è contiguo, la prima sottostringa viene convertita in un oggetto String e aggiunta come elemento della raccolta. Quindi l'elemento frapposto sarà aggiunto come elemento della raccolta e infine la sottostringa finale (se presente) verrà 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 lo spazio vuoto. 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" a livello radice perché la maggior parte dei modelli a oggetti non considera gli spazi vuoti significativi indipendentemente dalla modalità di impostazione dell'attributo. L'impostazione xml:space globalmente 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 rich text che supportano caratteri spazio unificatore. È necessario prestare molta attenzione se si usano entità per simulare 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 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 sottoinsieme talvolta è denominato anche "ideogrammi CJK". Per ulteriori informazioni, vedere https://www.unicode.org.

Spazi vuoti e testo con modalità tenda ls

In pratica, il mantenimento degli spazi vuoti riguarda solo un subset di tutti i possibili con modalità tenda ls. Tale sottoinsieme è composto dai modelli di contenuto che accettano un tipo String Singleton in una determinata forma, una raccolta String dedicata o una combinazione di String e di altri tipi in un raccolta IList o ICollection<T> .

Spazi vuoti e testo con modalità tenda ls 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 articolo sono pertinenti sia ai servizi XAML .NET che a WPF. Per una dimostrazione di questo comportamento, potrebbe essere utile provare a usare 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 con modalità tenda ls che possono accettare stringhe, il comportamento predefinito all'interno di questi con modalità tenda ls è che qualsiasi spazio vuoto che rimane non viene considerato significativo. Ad esempio, ListBox accetta un IListoggetto , ma lo spazio vuoto , ad esempio gli avanzamenti di riga tra ogni ListBoxItem, non viene mantenuto e non sottoposto a rendering. Se si tenta di usare 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.

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 . WhitespaceSignificantCollectionAttributeQuando viene trovato questo attributo, il processore XAML considererà lo spazio vuoto all'interno della raccolta come significativo. La combinazione di spazi vuoti e all'interno di xml:space="preserve" una WhitespaceSignificantCollectionAttribute raccolta indicata è che tutto lo spazio vuoto viene mantenuto e sottoposto a rendering. La combinazione di e spazi vuoti all'interno di xml:space="default" un WhitespaceSignificantCollectionAttribute determina 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. Sarà l'utente a decidere il comportamento più appropriato e a usare xml:space in maniera selettiva 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 oggetto è separato da qualsiasi testo successivo da un avanzamento riga creato. Tale avanzamento riga non deve essere normalizzato per l'utilizzo come spazio iniziale nella riga successiva. Per abilitare tale comportamento, la definizione della classe per l'elemento LineBreak applica , TrimSurroundingWhitespaceAttributeche viene quindi interpretata dal processore XAML per indicare che lo spazio vuoto circostante LineBreak viene sempre tagliato.

Vedi anche