Freigeben über


Leerstellenverarbeitung in XAML

Die Sprachregeln für XAML besagen, dass wichtige Leerzeichen von einer XAML-Prozessorimplementierung verarbeitet werden müssen. In diesem Thema werden diese XAML-Sprachregeln dokumentiert. Zudem wird die Behandlung zusätzlicher Leerzeichen erörtert, die in der Windows Presentation Foundation (WPF)-Implementierung des XAML-Prozessors und XAML-Writers für die Serialisierung definiert ist.

Dieses Thema enthält folgende Abschnitte.

  • Leerraumdefinition
  • Leerraumnormalisierung
  • Leerraum in innerem Text und Zeichenfolgenprimitiven
  • Beibehalten von Leerräumen
  • Ostasiatische Zeichen
  • Leerraum- und Textinhaltsmodelle
  • Verwandte Abschnitte

Leerraumdefinition

Wie in XML sind Leerraumzeichen in XAML Leerzeichen, Zeilenvorschub und Tabulator. Diese entsprechen den Unicode-Werten 0020, 000A bzw. 0009.

Leerraumnormalisierung

Standardmäßig wird die folgende Leerraumnormalisierung durchgeführt, wenn ein XAML-Prozessor eine XAML-Datei verarbeitet:

  1. Zeilenvorschubzeichen zwischen ostasiatischen Zeichen werden entfernt. Eine Definition dieses Begriffs finden Sie im Abschnitt "Ostasiatische Zeichen" weiter unten in diesem Thema.

  2. Alle Leerraumzeichen (Leerzeichen, Zeilenvorschub, Tabulator) werden in Leerzeichen konvertiert.

  3. Alle aufeinanderfolgenden Leerzeichen werden durch ein Leerzeichen ersetzt.

  4. Ein Leerzeichen, das direkt auf das Starttag folgt, wird gelöscht.

  5. Ein Leerzeichen, das direkt vor dem Endtag steht, wird gelöscht.

Der "Standardwert" entspricht dem Status, der vom Standardwert für das xml:space-Attribut angegeben ist.

Leerraum in innerem Text und Zeichenfolgenprimitiven

Die vorangehenden Normalisierungsregeln gelten für inneren Text, der in XAML-Elementen enthalten ist. Nach der Normalisierung konvertiert ein XAML-Prozessor inneren Text wie folgt in einen entsprechenden Typ:

  • Wenn der Eigenschaftentyp keine Auflistung, jedoch nicht direkt ein Object-Typ ist, versucht der XAML-Prozessor, mit dem Typkonverter eine Konvertierung in diesen Typ durchzuführen. Ein Konvertierungsfehler führt zu einem Kompilierzeitfehler.

  • Wenn der Eigenschaftentyp eine Auflistung und der innere Text zusammenhängend ist (keine dazwischenliegenden Elementtags), wird der innere Text als einzelne String analysiert. Wenn der Auflistungstyp die String nicht verwenden kann, führt dies ebenfalls zu einem Kompilierzeitfehler.

  • Wenn der Eigenschaftentyp Object ist, wird der innere Text als einzelne String analysiert. Falls dazwischenliegende Elementtags vorhanden sind, kommt es zu einem Kompilierzeitfehler, da der Object-Typ ein einzelnes Objekt impliziert (String oder anderes).

  • Wenn der Eigenschaftentyp eine Auflistung und der innere Text nicht zusammenhängend ist, wird die erste untergeordnete Zeichenfolge in eine String konvertiert und als Auflistungselement hinzugefügt, das dazwischenliegende Element wird als Auflistungselement hinzugefügt, und zum Schluss wird die nachgestellte untergeordnete Zeichenfolge (soweit vorhanden) der Auflistung als drittes String-Element hinzugefügt.

Beibehalten von Leerräumen

Es gibt mehrere Möglichkeiten zum Beibehalten von Leerräumen im Quell-XAML für die eigentliche Darstellung, auf die sich die XAML-Prozessor-Leerraumnormalisierung nicht auswirkt.

xml:space="preserve": Legen Sie dieses Attribut auf der Ebene des Elements fest, auf der eine Beibehaltung von Leerräumen erwünscht ist. Dadurch werden alle Leerzeichen beibehalten, die möglicherweise von Codebearbeitungsanwendungen hinzugefügt werden, um Elemente zur besseren Druckausrichtung als visuell intuitive Schachtelung darzustellen. Ob diese Leerzeichen gerendert werden, wird jedoch durch das Inhaltsmodell für das enthaltende Element bestimmt. xml:space="preserve" sollte nach Möglichkeit nicht auf der Stammebene angegeben werden, da die meisten Objektmodelle Leerzeichen als wichtig interpretieren, unabhängig davon, wie Sie das Attribut festlegen. In einigen Implementierungen kann sich das globale Festlegen von xml:space auf die Leistung bei der XAML-Verarbeitung auswirken (insbesondere bei der Serialisierung). Die empfohlene Vorgehensweise besteht darin, das Attribut nur auf der Ebene der Elemente festzulegen, die Leerräume in Zeichenfolgen rendern oder bei denen es sich um leerraumsignifikante Auflistungen handelt.

Entitäten und feste Leerzeichen: XAML unterstützt das Platzieren beliebiger Unicode-Entitäten in einem Textobjektmodell. Sie können dedizierte Entitäten wie feste Leerzeichen (  in UTF-8-Codierung) verwenden. Sie können auch Rich-Text-Steuerelemente verwenden, die feste Leerzeichen unterstützen. Wenn Sie Entitäten zum Simulieren von Layouteigenschaften wie Einzügen verwenden, sollten Sie vorsichtig vorgehen, da die Laufzeitausgabe der Entitäten von einer größeren Anzahl von Faktoren abhängt, als dies bei den Funktionen zum Erzeugen der Einzugsergebnisse in einem typischen Layoutsystem der Fall wäre (z. B. die korrekte Verwendung von Bereichen und Rändern). So sind Entitäten Schriften zugeordnet und können ihre Größe ändern, je nachdem, welche Schrift der Benutzer auswählt.

Ostasiatische Zeichen

"Ostasiatische Zeichen" werden als Satz von Unicode-Zeichenbereichen von U+20000 bis U+2FFFD und U+30000 bis U+3FFFD definiert. Diese Teilmenge wird manchmal auch als "CJK-Ideogramme" bezeichnet. Weitere Informationen finden Sie unter http://www.unicode.org.

Leerraum- und Textinhaltsmodelle

In der Praxis ist die Beibehaltung von Leerräumen nur für eine Teilmenge aller möglichen Inhaltsmodelle von Bedeutung. Diese Teilmenge besteht aus Inhaltsmodellen, die einen Singleton-String-Typ in einem bestimmten Format, eine dedizierte String-Auflistung oder eine Kombination von String und anderen Typen in einer IList-Auflistung oder ICollection<T>-Auflistung verwenden kann.

Leerraum- und Textinhaltsmodelle in WPF

Zur Veranschaulichung verweist der Rest dieses Abschnitts auf bestimmte Typen, die von WPF definiert werden. Die in diesem Thema beschriebenen Funktionen zur Behandlung von Leerzeichen gelten im Allgemeinen sowohl für .NET Framework-XAML-Dienste als auch für WPF. Um diese Verhaltensweisen in Aktion zu sehen, können Sie mit WPF-XAML-Markup experimentieren, die Ergebnisse in einem Objektdiagramm anzeigen und dann wieder in das Markup serialisieren.

Auch bei Inhaltsmodellen, die Zeichenfolgen verwenden können, besteht das Standardverhalten in diesen Inhaltsmodellen darin, dass verbleibende Leerräume als nicht signifikant behandelt werden. ListBox verwendet z. B. eine IList, die Leerzeichen (z. B. Zeilenvorschübe zwischen den einzelnen ListBoxItem-Elementen) werden jedoch nicht beibehalten und nicht gerendert. Wenn Sie versuchen, Zeilenvorschübe als Trennzeichen zwischen Zeichenfolgen für ListBoxItem-Elemente zu verwenden, werden Sie feststellen, dass dies überhaupt nicht funktioniert. Die durch Zeilenvorschübe getrennten Zeichenfolgen werden als eine Zeichenfolge und ein Element behandelt.

Die Auflistungen, bei denen Leerräume als signifikant behandelt werden, sind in der Regel Teil des Flussdokumentmodells. Die primäre Auflistung, die die Beibehaltung von Leerräumen unterstützt, ist die InlineCollection. Diese Auflistungsklasse wird mit dem WhitespaceSignificantCollectionAttribute deklariert; wenn dieses Attribut gefunden wird, behandelt der XAML-Prozessor Leerräume in der Auflistung als signifikant. Die Kombination von xml:space="preserve" und Leerzeichen in einer mit WhitespaceSignificantCollectionAttribute gekennzeichneten Auflistung führt dazu, dass alle Leerzeichen beibehalten und gerendert werden. Die Kombination von xml:space="default" und Leerzeichen in einem WhitespaceSignificantCollectionAttribute führt zu der weiter oben beschriebenen anfänglichen Leerzeichennormalisierung, bei der ein Leerzeichen an bestimmten Stellen erhalten bleibt und diese Leerzeichen beibehalten und gerendert werden. Sie müssen selbst entscheiden, welches Verhalten verwendet werden soll; Sie sollten xml:space selektiv verwenden, um das gewünschte Verhalten zu aktivieren.

Außerdem sollten bestimmte Inlineelemente, die einen Zeilenumbruch in einem Flussdokumentmodell kennzeichnen, absichtlich kein zusätzliches Leerzeichen in einer leerraumsignifikanten Auflistung einfügen. So hat z. B. das LineBreak-Element den gleichen Zweck wie das <BR/>-Tag in HTML. Zur besseren Lesbarkeit im Markup wird ein LineBreak in der Regel durch einen erstellten Zeilenvorschub von nachfolgendem Text getrennt. Dieser Zeilenvorschub sollte nicht normalisiert werden, sodass er zu einem Leerraum in der nachfolgenden Zeile wird. Um dieses Verhalten zu aktivieren, wendet die Klassendefinition für das LineBreak-Element das TrimSurroundingWhitespaceAttribute an, das dann vom XAML-Prozessor so interpretiert wird, dass Leeräume um LineBreak immer verkürzt werden.

Siehe auch

Referenz

XML-Zeichenentitäten und XAML

xml:space-Behandlung in XAML

Konzepte

Übersicht über XAML (WPF)