Bearbetning av tomt utrymme i XAML
Språkreglerna för XAML anger att betydande tomt utrymme måste bearbetas av en XAML-processorimplementering. Den här artikeln dokumenterar dessa XAML-språkregler. Den dokumenterar också ytterligare white-space-hantering som definieras av WINDOWS Presentation Foundation-implementeringen (WPF) av XAML-processorn och XAML-skrivaren för serialisering.
Definition av tomt utrymme
I enlighet med XML är blankstegstecken i XAML blanksteg, radmatning och flik. Dessa motsvarar Unicode-värdena 0020, 000A respektive 0009.
Normalisering av tomt utrymme
Som standard sker följande normalisering av tomt utrymme när en XAML-processor bearbetar en XAML-fil:
Radmatningstecken mellan östasiatiska tecken tas bort. Se avsnittet "Östasiatiska tecken" senare i det här avsnittet för en definition av den här termen.
Alla blankstegstecken (blanksteg, radmatning, flik) konverteras till blanksteg.
Alla efterföljande blanksteg tas bort och ersätts med ett blanksteg.
Ett utrymme omedelbart efter starttaggen tas bort.
Ett utrymme omedelbart innan sluttaggen tas bort.
"Standard" motsvarar det tillstånd som anges med standardvärdet för attributet xml:space.
Tomt utrymme i inre text och strängpri primitiver
De tidigare normaliseringsreglerna gäller för inre text som finns i XAML-element. Efter normaliseringen konverterar en XAML-processor all inre text till en lämplig typ enligt följande:
Om egenskapens typ inte är en samling men inte direkt är en Object typ, försöker XAML-processorn konvertera till den typen med hjälp av dess typkonverterare. En misslyckad konvertering här orsakar ett kompileringsfel.
Om egenskapens typ är en samling och den inre texten är sammanhängande (inga mellanliggande elementtaggar) parsas den inre texten som en enda String. Om samlingstypen inte kan acceptera Stringorsakar detta även ett kompileringsfel.
Om egenskapens typ är Objecttolkas den inre texten som en enda String. Om det finns mellanliggande elementtaggar orsakar detta ett kompileringsfel eftersom den Object typen innebär ett enskilt objekt (String eller på annat sätt).
Om egenskapens typ är en samling och den inre texten inte är sammanhängande konverteras den första delsträngen till en String och läggs till som ett samlingsobjekt, läggs det mellanliggande elementet till som ett samlingsobjekt och slutligen läggs den avslutande delsträngen (om någon) till i samlingen som ett tredje String objekt.
Bevara tomt utrymme
Det finns flera tekniker för att bevara tomt utrymme i XAML-källan för eventuell presentation som inte påverkas av XAML-processorns normalisering av tomt utrymme.
xml:space="preserve": Ange det här attributet på nivån för elementet där bevarande av tomt utrymme önskas. Detta bevarar allt tomt utrymme, vilket inkluderar blanksteg som kan läggas till av kodredigeringsprogram till "pretty-print" justera element som en visuellt intuitiv kapsling. Men om dessa blanksteg återges bestäms av innehållsmodellen för det innehållande elementet. Undvik att ange xml:space="preserve"
på rotnivå eftersom de flesta objektmodeller inte anser att blanksteg är betydande oavsett hur du anger attributet. Att ange xml:space
globalt kan få prestandakonsekvenser för XAML-bearbetning (särskilt serialisering) i vissa implementeringar. Det är en bättre praxis att endast ange attributet specifikt på nivån för element som renderar blanksteg i strängar eller är blankstegs viktiga samlingar.
Entiteter och icke-icke-bakåtkompatibla blanksteg: XAML stöder placering av unicode-entiteter i en textobjektmodell. Du kan använda dedikerade entiteter som icke-indelningsutrymme ( i UTF-8-kodning). Du kan också använda RTF-kontroller som stöder blankstegstecken som inte är indelande. Du bör vara försiktig om du använder entiteter för att simulera layoutegenskaper som indrag, eftersom körningsutdata för entiteterna varierar beroende på ett större antal faktorer än vad som skulle kunna användas för att skapa indrag, vilket resulterar i ett typiskt layoutsystem, till exempel korrekt användning av paneler och marginaler. Till exempel mappas entiteter till teckensnitt och kan ändra storlek som svar på val av användarteckensnitt.
Östasiatiska tecken
"Östasiatiska tecken" definieras som en uppsättning Unicode-teckenintervall U+20000 till U+2FFFD och U+30000 till U+3FFFD. Den här delmängden kallas ibland även för "CJK-ideografier". Mer information finns i https://www.unicode.org.
Modeller för tomt utrymme och textinnehåll
I praktiken är bevarande av tomt utrymme endast en delmängd av alla möjliga innehållsmodeller. Den delmängden består av innehållsmodeller som kan ta en singleton-String typ i någon form, en dedikerad String samling eller en blandning av String och andra typer i en IList eller ICollection<T> samling.
Modeller för tomt utrymme och textinnehåll i WPF
I illustrationssyfte refererar resten av det här avsnittet till vissa typer som definieras av WPF. Funktionerna för hantering av blanksteg som beskrivs i den här artikeln är relevanta för både .NET XAML Services och WPF. Om du vill se det här beteendet i praktiken kan du experimentera med någon WPF XAML-markering, visa resultatet i ett objektdiagram och sedan serialisera tillbaka till markering igen.
Även för innehållsmodeller som kan ta strängar är standardbeteendet i dessa innehållsmodeller att allt tomt utrymme som finns kvar inte behandlas som betydande. Till exempel tar ListBox en IList, men det tomma utrymmet (till exempel radmatningar mellan varje ListBoxItem) bevaras inte och återges inte. Om du försöker använda linjefeeds som avgränsare mellan strängar för ListBoxItem objekt fungerar det inte alls. de strängar som avgränsas av radfeeds behandlas som en sträng och ett objekt.
De samlingar som behandlar blanksteg som betydande är vanligtvis en del av flödesdokumentmodellen. Den primära samlingen som stöder bevarande av tomt utrymme är InlineCollection. Den här samlingsklassen deklareras med WhitespaceSignificantCollectionAttribute; när det här attributet hittas behandlar XAML-processorn blanksteg i samlingen som betydande. Kombinationen av xml:space="preserve"
och tomt utrymme i en WhitespaceSignificantCollectionAttribute angiven samling är att allt tomt utrymme bevaras och återges. Kombinationen av xml:space="default"
och tomt utrymme inom en WhitespaceSignificantCollectionAttribute orsakar den inledande normaliseringen av tomt utrymme som beskrevs tidigare, vilket lämnar ett utrymme i vissa positioner, och dessa blanksteg bevaras och återges. Vilket beteende som är önskvärt är upp till dig, och du bör använda xml:space
selektivt för att aktivera det beteende som du vill ha.
Dessutom bör vissa infogade element som anger en radbrytning i en flödesdokumentmodell avsiktligt inte introducera ett extra utrymme även i en betydande samling med blanksteg. Till exempel har LineBreak-elementet samma syfte som taggen <BR/> i HTML, och för läsbarhet i markering separeras vanligtvis en LineBreak från efterföljande text av en redigerad linjefeed. Den här linjefeeden bör inte normaliseras för att bli ett inledande blanksteg på den efterföljande raden. För att aktivera det beteendet tillämpar klassdefinitionen för elementet LineBreakTrimSurroundingWhitespaceAttribute, som sedan tolkas av XAML-processorn så att tomt utrymme som omger LineBreak alltid trimmas.
Se även
.NET Desktop feedback