Zpracování prázdných znaků v XAML
Pravidla jazyka pro stav XAML, který musí zpracovat významné prázdné znaky, musí být zpracována implementací procesoru XAML. Tento článek dokumentuje tato jazyková pravidla XAML. Dokumentuje také další zpracování prázdných znaků, které je definováno implementací Windows Presentation Foundation (WPF) procesoru XAML a zapisovače XAML pro serializaci.
Definice prázdného místa
Konzistentní s XML, prázdnými znaky v JAZYCE XAML jsou mezera, kanál řádku a tabulátor. Odpovídají hodnotám Unicode 0020, 000A a 0009.
Normalizace prázdných znaků
Ve výchozím nastavení dochází k následující normalizaci prázdných znaků, když procesor XAML zpracuje soubor XAML:
Odeberou se znaky v kanálu řádků mezi znaky východoasijských jazyků. Definici tohoto termínu najdete dále v tomto tématu v části Znaky východoasijských jazyků.
Všechny prázdné znaky (mezera, spojnice, tabulátor) se převedou na mezery.
Všechny po sobě jdoucí mezery se odstraní a nahradí jednou mezerou.
Odstraní se mezera bezprostředně za počáteční značkou.
Mezera bezprostředně před odstraněním koncové značky.
Výchozí odpovídá stavu označenému výchozí hodnotou atributu xml:space.
Prázdné znaky ve vnitřním textu a primitivy řetězců
Předchozí pravidla normalizace platí pro vnitřní text nalezený v elementech XAML. Po normalizaci převede procesor XAML jakýkoli vnitřní text na odpovídající typ následujícím způsobem:
Pokud typ vlastnosti není kolekce, ale není přímo typ Object, procesor XAML se pokusí převést na tento typ pomocí svého převaděče typů. Neúspěšný převod zde způsobí chybu v době kompilace.
Pokud je typem vlastnosti kolekce a vnitřní text je souvislý (bez značek prvků), vnitřní text se analyzuje jako jeden String. Pokud typ kolekce nemůže přijmout String, způsobí to také chybu v době kompilace.
Pokud je typ vlastnosti Object, vnitřní text se analyzuje jako jeden String. Pokud existují intervenující značky elementů, to způsobí chybu v době kompilace, protože typ Object znamená jeden objekt (String nebo jinak).
Pokud je typ vlastnosti kolekcí a vnitřní text není souvislý, první podřetětěc se převede na String a přidá se jako položka kolekce, intervening element se přidá jako položka kolekce a nakonec se koncový podřetěc (pokud existuje) přidá do kolekce jako třetí String položka.
Zachování prázdných znaků
Existuje několik technik zachování prázdných znaků ve zdrojovém kódu XAML pro případnou prezentaci, které nejsou ovlivněny normalizací prázdných znaků procesoru XAML.
xml:space="preserve": Zadejte tento atribut na úrovni prvku, kde je vyžadováno zachování prázdných znaků. Tím se zachovají všechny prázdné znaky, včetně mezer, které by mohly být přidány aplikacemi pro úpravy kódu, aby se prvky "pretty-print" zarovnaly jako vizuálně intuitivní vnoření. Nicméně, zda jsou tyto mezery vykresleny modelem obsahu pro obsahující prvek. Vyhněte se zadávání xml:space="preserve"
na kořenové úrovni, protože většina objektových modelů nepovažuje prázdné znaky za významné bez ohledu na to, jak nastavíte atribut. Nastavení xml:space
globálně může mít vliv na výkon zpracování XAML (zejména serializace) v některých implementacích. Je lepší nastavit atribut pouze na úrovni prvků, které vykreslují prázdné znaky v řetězcích, nebo jsou prázdné znaky významné kolekce.
Entity a nerušované mezery: XAML podporuje umístění libovolné entity Unicode do textového objektového modelu. V kódování UTF-8 můžete použít vyhrazené entity, jako je například nerozbité místo ( ). Můžete také použít ovládací prvky formátovaného textu, které podporují nerozbité znaky mezery. Pokud používáte entity k simulaci charakteristik rozložení, jako je odsazení, měli byste být opatrní, protože výstup za běhu entit se bude lišit na základě většího počtu faktorů, než by možnosti pro vytváření odsazení měly za následek typický systém rozložení, například správné použití panelů a okrajů. Například entity se mapují na písma a můžou změnit velikost v reakci na výběr písma uživatele.
Znaky východoasijských jazyků
"Znaky východoasijských jazyků" jsou definovány jako sada oblastí znaků Unicode U+20000 až U+2FFFD a U+30000 až U+3FFFD. Tato podmnožina se také někdy označuje jako "ideografie CJK". Další informace najdete v tématu https://www.unicode.org.
Prázdné znaky a modely textového obsahu
V praxi je zachování prázdných znaků jen pro podmnožinu všech možných modelů obsahu. Tato podmnožina se skládá z modelů obsahu, které můžou mít jeden typ String v nějaké podobě, vyhrazenou kolekci String nebo kombinaci String a jiných typů v IList nebo ICollection<T> kolekci.
Prázdné znaky a modely textového obsahu ve WPF
Pro ilustraci zbývající část tohoto oddílu odkazuje na konkrétní typy, které jsou definovány WPF. Funkce pro zpracování prázdných znaků, které jsou popsané v tomto článku, jsou relevantní pro služby .NET XAML i WPF. Chcete-li zobrazit toto chování v akci, můžete experimentovat s některými kódy WPF XAML, zobrazit výsledky v grafu objektu a potom serializovat zpět na revize znovu.
I u modelů obsahu, které mohou přijímat řetězce, je výchozím chováním v těchto modelech obsahu, že jakékoli prázdné znaky, které zůstávají, nejsou považovány za významné. Například ListBox vezme IList, ale prázdné znaky (například spojnice mezi jednotlivými ListBoxItem) se nezachovají a nevykreslují. Pokud se pokusíte použít čáry jako oddělovače mezi řetězci pro ListBoxItem položky, nefunguje vůbec; řetězce, které jsou odděleny od řádků, jsou považovány za jeden řetězec a jednu položku.
Tyto kolekce, které zpracovávají prázdné znaky jako významné, jsou obvykle součástí modelu dokumentu toku. Primární kolekce, která podporuje chování zachování prázdných znaků, je InlineCollection. Tato třída kolekce je deklarována s WhitespaceSignificantCollectionAttribute; když se tento atribut najde, procesor XAML bude zacházet s prázdným místem v kolekci jako významné. Kombinace xml:space="preserve"
a prázdného místa v WhitespaceSignificantCollectionAttribute označené kolekci spočívá v tom, že se zachovají a vykreslují všechny prázdné znaky. Kombinace xml:space="default"
a prázdného místa v rámci WhitespaceSignificantCollectionAttribute způsobí počáteční normalizaci prázdných znaků popsaných dříve, což ponechá jednu mezeru v určitých pozicích a tyto mezery se zachovají a vykreslují. Jaké chování je žádoucí, je na vás a měli byste použít xml:space
selektivně povolit požadované chování.
Některé vložené prvky, které označují zalomení řádku v modelu dokumentu toku, by také neměly záměrně zavádět nadbytečné mezery ani ve významné kolekci prázdných znaků. Například prvek LineBreak má stejný účel jako značka <BR/> ve formátu HTML a pro čitelnost v kódu, obvykle je LineBreak oddělen od jakéhokoli dalšího textu vytvořeným linefeedem. Tento spojnicový kanál by neměl být normalizován tak, aby se stal úvodní mezerou v následujícím řádku. Chcete-li toto chování povolit, definice třídy pro prvek LineBreak použije TrimSurroundingWhitespaceAttribute, která je pak interpretována procesorem XAML, což znamená, že prázdné znaky okolní LineBreak jsou vždy oříznuty.
Viz také
.NET Desktop feedback