Leerstellenverarbeitung in XAMLWhite-space processing in XAML

Gemäß den Sprachregeln für XAML Status, signifikante Leerraum verarbeitet werden müssen, indem eine XAMLXAML -prozessorimplementierung.The language rules for XAML state that significant white space must be processed by a XAMLXAML processor implementation. In diesem Thema werden diese XAML-Sprachregeln erläutert.This topic documents these XAML language rules. Er dokumentiert auch zusätzliche Leerzeichen behandeln, die von definiert ist die Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) Implementierung der XAML-Prozessor und der XAML-Writer für die Serialisierung.It also documents additional white space handling that is defined by the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) implementation of the XAML processor and the XAML writer for serialization.

White-Space-definitionWhite-space definition

Das sortierflag XMLXML, Leerzeichen XAMLXAML werden Leerzeichen, Zeilenvorschub und Registerkarte. Diese entsprechen den UnicodeUnicode -Werten 0020, 000A bzw. 0009.Consistent with XMLXML, white-space characters in XAMLXAML are space, linefeed, and tab. These correspond to the UnicodeUnicode values 0020, 000A, and 0009 respectively.

Normalisierung von LeerzeichenWhite-space normalization

Wird standardmäßig die folgenden leerstellennormalisierung tritt auf, wenn eine XAMLXAML Prozessor Prozesse eine XAMLXAML Datei:By default the following white-space normalization occurs when a XAMLXAML processor processes a XAMLXAML file:

  1. Zeilenvorschubzeichen zwischen ostasiatischen Zeichen werden entfernt.Linefeed characters between East Asian characters are removed. Eine Definition dieses Begriffs finden Sie im Abschnitt „Ostasiatische Zeichen“ weiter hinten in diesem Thema.See the "East Asian Characters" section later in this topic for a definition of this term.

  2. Alle Leerraumzeichen (Leerzeichen, Zeilenvorschub, Registerkarte ") werden in Leerzeichen konvertiert.All white-space characters (space, linefeed, tab) are converted into spaces.

  3. Alle aufeinander folgenden Leerzeichen werden gelöscht und durch ein Leerzeichen ersetzt.All consecutive spaces are deleted and replaced by one space.

  4. Ein Leerzeichen unmittelbar nach dem Starttag wird gelöscht.A space immediately following the start tag is deleted.

  5. Ein Leerzeichen unmittelbar vor dem Endtag wird gelöscht.A space immediately before the end tag is deleted.

„Standard“ entspricht dem Zustand, der durch den Standardwert des xml:space -Attribut bezeichnet wird."Default" corresponds to the state denoted by the default value of the xml:space attribute.

Leerraum in innerem Text und zeichenfolgenprimitiveWhite space in inner text, and string primitives

Die oben genannten Normalisierungsregeln gelten für inneren Text innerhalb von XAML-Elementen.The previous normalization rules apply to inner text that is found within XAML elements. Nach der Normalisierung konvertiert ein XAML-Prozessor inneren Text wie folgt in einen entsprechenden Typ:After normalization, a XAML processor converts any inner text into an appropriate type as follows:

  • Wenn der Typ der Eigenschaft keine Auflistung, aber nicht direkt ein Object -Typ ist, versucht der XAML-Prozessor, unter Verwendung seines Typkonverters eine Konvertierung in diesen Typ durchzuführen.If the type of the property is not a collection but is not directly an Object type, the XAML processor attempts to convert to that type by using its type converter. Ein Konvertierungsfehler verursacht einen Fehler zu Kompilierzeit.A failed conversion here causes a compile-time error.

  • Wenn der Typ der Eigenschaft eine Auflistung und der innere Text zusammenhängend ist (keine dazwischen liegenden Elementtags), wird der innere Text als einzelner Stringanalysiert.If the type of the property is a collection and the inner text is contiguous (no intervening element tags), the inner text is parsed as a single String. Wenn der Auflistungstyp Stringnicht akzeptieren kann, führt dies ebenfalls zu einem Kompilierzeitfehler.If the collection type cannot accept String, this also causes a compile-time error.

  • Wenn der Typ der Eigenschaft Objectist, wird der innere Text als einzelner Stringanalysiert.If the type of the property is Object, the inner text is parsed as a single String. Wenn dazwischen liegende Elementtags vorhanden sind, führt dies zu einem Kompilierzeitfehler, da der Object -Typ ein einzelnes Objekt impliziert (String oder anderes).If there are intervening element tags, this causes a compile-time error because the Object type implies a single object (String or otherwise).

  • Wenn der Typ der Eigenschaft eine Auflistung und der innere Text nicht zusammenhängend ist, wird die erste Teilzeichenfolge in einen String konvertiert und als Auflistungselement hinzugefügt, das dazwischen liegende Element wird als Auflistungselement hinzugefügt, und schließlich wird die nachgestellte Teilzeichenfolge (sofern vorhanden) der Auflistung als drittes String -Element hinzugefügt.If the type of the property is a collection, and the inner text is not contiguous, the first substring is converted into a String and added as a collection item, the intervening element is added as a collection item, and finally the trailing substring (if any) is added to the collection as a third String item.

Beibehalten von LeerraumPreserving white space

Es gibt mehrere Verfahren zum Beibehalten von Leerzeichen in der Quelle XAMLXAML für die nachfolgende Darstellung, die nicht betroffen sind XAMLXAML leerstellennormalisierung Prozessor.There are several techniques for preserving white space in the source XAMLXAML for eventual presentation that are not affected by XAMLXAML processor white-space normalization.

xml:space="preserve": Geben Sie dieses Attribut auf der Ebene des Elements, in denen Leerraum beibehalten wird.xml:space="preserve": Specify this attribute at the level of the element where white-space preservation is desired. Hierdurch werden alle Leerräume beibehalten, auch die Leerzeichen, die ggf. von Codebearbeitungsanwendungen als visuell intuitive Schachtelung hinzugefügt werden, um Elemente für den Schöndruck auszurichten.This preserves all white space, which includes the spaces that might be added by code-editing applications to "pretty-print" align elements as a visually intuitive nesting. Ob diese Leerzeichen gerendert werden, wird jedoch durch das Inhaltsmodell für das enthaltende Element bestimmt.However, whether those spaces render is determined by the content model for the containing element. Vermeiden Sie es, xml:space="preserve" auf der Stammebene, da die meisten Objektmodelle weiß nicht berücksichtigt werden Leerzeichen als signifikant, unabhängig davon, wie Sie das Attribut festlegen.Avoid specifying xml:space="preserve" at the root level because most object models do not consider white space as significant regardless of how you set the attribute. Die globale Festlegung von xml:space kann in einigen Implementierungen die Leistung der XAML-Verarbeitung (insbesondere der Serialisierung) beeinträchtigen.Setting xml:space globally may have performance consequences on XAML processing (particularly serialization) in some implementations. Es ist empfehlenswert, die das Attribut nur speziell auf der Ebene von Elementen festgelegt werden kann, die Leerzeichen in Zeichenfolgen rendern oder Auflistungen Leerzeichen sind.It is a better practice to only set the attribute specifically at the level of elements that render white space within strings, or are white-space significant collections.

Entitäten und geschützte Leerzeichen: XAMLXAML unterstützt das Platzieren beliebiger UnicodeUnicode -Entitäten in einem Textobjektmodell.Entities and non breaking spaces: XAMLXAML supports placing any UnicodeUnicode entity within a text object model. Sie können dedizierte Entitäten wie geschützte Leerzeichen (  in UTF-8-Codierung).You can use dedicated entities such as nonbreaking space (  in UTF-8 encoding). Sie können auch Rich-Text-Steuerelemente verwenden, die geschützte Leerzeichen unterstützen.You can also use rich text controls that support nonbreaking space characters. Seien Sie vorsichtig, wenn Sie Entitäten zum Simulieren von Layouteigenschaften wie Einzügen verwenden, da die Laufzeitausgabe der Entitäten basierend auf einer größeren Anzahl von Faktoren variiert, als dies bei den Funktionen zum Erzeugen von Einzugsergebnisse in einem typischen Layoutsystem der Fall ist, z. B. richtige Verwendung von Bereichen und Rändern.You should be cautious if you are using entities to simulate layout characteristics such as indention, because the run-time output of the entities will vary based on a greater number of factors than would the capabilities for producing indention results in a typical layout system, such as proper use of panels and margins. Beispielsweise werden Entitäten Schriftarten zugeordnet und können sich als Reaktion auf eine Schriftartauswahl durch den Benutzer in der Größe ändern.For instance, entities are mapped to fonts and can change size in response to user font selection.

Ostasiatische ZeichenEast Asian characters

Unter „ostasiatischen Zeichen“ versteht man einen Satz von UnicodeUnicode -Zeichen in den Bereichen von U+20000 bis U+2FFFD und U+30000 bis U+3FFFD."East Asian characters" is defined as a set of UnicodeUnicode character ranges U+20000 to U+2FFFD and U+30000 to U+3FFFD. Diese Teilmenge wird manchmal auch als „CJK-Ideogramme“ bezeichnet.This subset is also sometimes referred to as "CJK ideographs". Weitere Informationen finden Sie unter https://www.unicode.org.For more information, see https://www.unicode.org.

Leerzeichen und TextinhaltsmodelleWhite space and text content models

In der Praxis ist das Beibehalten von Leerzeichen nur von Bedeutung für eine Teilmenge aller möglichen Inhaltsmodelle.In practice, preserving white space is only of concern for a subset of all possible content models. Diese Teilmenge besteht aus Inhaltsmodellen, die eine Form von Singleton- String -Typ, eine dedizierte String -Auflistung oder eine Mischung aus String und anderen Typen in einer IList - oder ICollection<T> -Auflistung verwenden können.That subset is composed of content models that can take a singleton String type in some form, a dedicated String collection, or a mixture of String and other types in an IList or ICollection<T> collection.

Leerzeichen und Textinhaltsmodelle in WPFWhite space and text content models in WPF

Zur Veranschaulichung bezieht sich der Rest dieses Abschnitts auf bestimmte von WPF definierte Typen.For illustration purposes, the remainder of this section references particular types that are defined by WPF. Die Behandlung von Leerraum Funktionen, die in diesem Thema beschrieben werden gelten im Allgemeinen sowohl WPF als auch .NET Framework-XAML-Dienste.The white-space handling features that are described in this topic are generally pertinent to both .NET Framework XAML Services and WPF. Um diese Verhaltensweisen in Aktion zu sehen, können Sie mit einigen WPF-XAML-Markups experimentieren, die Ergebnisse in einem Objektdiagramm anzeigen und dann wieder zurück zu Markup serialisieren.To see this behavior in action, you might experiment with some WPF XAML markup, view the results in an object graph, and then serialize back to markup again.

Sogar für Inhaltsmodelle, Zeichenfolgen, das Standardverhalten innerhalb dieser Inhaltsmodelle ist, dass eine beliebige leere Fläche, die verbleibt, als nicht signifikant behandelt wird.Even for content models that can take strings, the default behavior within these content models is that any white space that remains is not treated as significant. Z. B. ListBox nimmt eine IList, aber der Leerraum (wie z. B. Zeilenvorschübe zwischen den einzelnen ListBoxItem) wird nicht beibehalten und nicht gerendert.For example, ListBox takes an IList, but the white space (such as linefeeds between each ListBoxItem) is not preserved and not rendered. Wenn Sie versuchen, Zeilenvorschübe als Trennzeichen zwischen Zeichenfolgen für ListBoxItem -Elemente zu verwenden, funktioniert dies nicht; alle durch die Zeilenvorschübe getrennten Zeichenfolgen werden als eine Zeichenfolge und ein Element behandelt.If you attempt to use linefeeds as separators between strings for ListBoxItem items, it does not work at all; the strings that are separated by the linefeeds are treated as one string and one item.

Diese Auflistungen, die Leerräume als signifikant behandeln, sind in der Regel Teil des flussdokumentmodells.Those collections that do treat white space as significant are typically part of the flow document model. Ist die primäre Auflistung, das Beibehalten von Leerraum Verhalten unterstützt InlineCollection.The primary collection that supports white-space preservation behavior is InlineCollection. Diese Auflistungsklasse wird mit deklariert die WhitespaceSignificantCollectionAttribute; Wenn dieses Attribut gefunden wird, die XAMLXAML Prozessor behandelt Leerzeichen in der Auflistung als signifikant.This collection class is declared with the WhitespaceSignificantCollectionAttribute; when this attribute is found, the XAMLXAML processor will treat white space within the collection as significant. Die Kombination von xml:space="preserve" und Leerzeichen innerhalb einer WhitespaceSignificantCollectionAttribute bezeichneten Auflistung führt dazu, dass alle Leerräume beibehalten und gerendert werden.The combination of xml:space="preserve" and white space within a WhitespaceSignificantCollectionAttribute denoted collection is that all white space is preserved and rendered. Die Kombination von xml:space="default" und Leerzeichen innerhalb einer WhitespaceSignificantCollectionAttribute bewirkt die anfängliche leerstellennormalisierung weiter oben beschriebene, die ein Leerzeichen an bestimmten Positionen beibehält, und diese Leerzeichen werden beibehalten und gerendert.The combination of xml:space="default" and white space within a WhitespaceSignificantCollectionAttribute causes the initial white-space normalization described earlier, which leaves one space in certain positions, and those spaces are preserved and rendered. Welches Verhalten Sie bevorzugen, steht Ihnen frei, und Sie sollten xml:space selektiv verwenden, um das gewünschte Verhalten zu aktivieren.Which behavior is desirable is up to you, and you should use xml:space selectively to enable the behavior that you want.

Darüber hinaus sollten bestimmte Inlineelemente, die einen Zeilenumbruch in einem Flussdokumentmodell absichtlich nicht auch in eine Auflistung Leerzeichen ein zusätzliches Leerzeichen führen.Also, certain inline elements that connote a linebreak in a flow document model should deliberately not introduce an extra space even in a white-space significant collection. Z. B. die LineBreak Element hat den gleichen Zweck wie die <BR / >-Tag in HTMLHTML, und zur besseren Lesbarkeit im Markup in der Regel eine LineBreak wird durch einen erstellten Zeilenvorschub von nachfolgendem Text getrennt.For example, the LineBreak element has the same purpose as the <BR/> tag in HTMLHTML, and for readability in markup, typically a LineBreak is separated from any subsequent text by an authored linefeed. Dieser Zeilenvorschub darf nicht zu einem voranstellten Leerzeichen in der nächsten Zeile normalisiert werden.That linefeed should not be normalized to become a leading space in the subsequent line. So aktivieren Sie dieses Verhalten, die Klassendefinition für den LineBreak Element gilt die TrimSurroundingWhitespaceAttribute, wird dann von interpretiert die XAMLXAML -Prozessor so, Leerzeichen, umgibt LineBreak immer entfernt.To enable that behavior, the class definition for the LineBreak element applies the TrimSurroundingWhitespaceAttribute, which is then interpreted by the XAMLXAML processor to mean that white space surrounding LineBreak is always trimmed.

Siehe auchSee also