Ausführliche Erläuterung der XAML-SyntaxXAML Syntax In Detail

In diesem Thema werden die Begriffe definiert, die verwendet werden, um die Elemente der XAML-Syntax zu beschreiben.This topic defines the terms that are used to describe the elements of XAML syntax. Diese Begriffe werden im restlichen Teil dieser Dokumentation häufig verwendet, sowohl für die WPF-Dokumentation als auch für die anderen Frameworks, die XAML oder die grundlegenden XAML-Konzepte verwenden, die von der XAML-Sprachunterstützung auf der System. XAML-Ebene aktiviert werden.These terms are used frequently throughout the remainder of this documentation, both for WPF documentation specifically and for the other frameworks that use XAML or the basic XAML concepts enabled by the XAML language support at the System.Xaml level. Dieses Thema erweitert die grundlegende Terminologie, die im Thema Übersicht über XAML (WPF)vorgestellt wurde.This topic expands on the basic terminology introduced in the topic XAML Overview (WPF).

Die XAML-SprachspezifikationThe XAML Language Specification

Die hier definierte XAML-Syntax Terminologie ist auch definiert oder wird innerhalb der XAML-Sprachspezifikation referenziert.The XAML syntax terminology defined here is also defined or referenced within the XAML language specification. XAML ist eine Sprache, die auf XML basiert und auf XML-Struktur Regeln folgt oder Sie erweitert.XAML is a language based on XML and follows or expands upon XML structural rules. Einige der Begriffe werden von freigegeben oder basieren auf der Terminologie, die häufig verwendet wird, wenn die XML-Sprache oder das XML-Dokument Objektmodell beschrieben wird.Some of the terminology is shared from or is based on the terminology commonly used when describing the XML language or the XML document object model.

Weitere Informationen zur XAML-Sprachspezifikation finden Sie unter herunterladen [von MS-] XAML aus dem Microsoft Download Center.For more information about the XAML language specification, download [MS-XAML] from the Microsoft Download Center.

XAML und CLRXAML and CLR

XAML ist eine Markup Sprache.XAML is a markup language. Der Common Language Runtime (CLR), wie er durch seinen Namen impliziert, ermöglicht die Lauf Zeit Ausführung.The common language runtime (CLR), as implied by its name, enables runtime execution. Bei XAML handelt es sich nicht um eine der allgemeinen Sprachen, die von der CLR-Laufzeit direkt genutzt werden.XAML is not by itself one of the common languages that is directly consumed by the CLR runtime. Stattdessen können Sie sich XAML als Unterstützung eines eigenen Typsystems vorstellen.Instead, you can think of XAML as supporting its own type system. Das spezielle von WPF verwendete XAML-Erstellungs System basiert auf der CLR und dem CLR-Typsystem.The particular XAML parsing system that is used by WPF is built on the CLR and the CLR type system. XAML-Typen werden CLR-Typen zugeordnet, um eine Lauf Zeit Darstellung zu instanziieren, wenn die XAML für WPF analysiert wird.XAML types are mapped to CLR types to instantiate a run time representation when the XAML for WPF is parsed. Aus diesem Grund enthält der Rest der Erörterung der Syntax in diesem Dokument Verweise auf das CLR-Typsystem, auch wenn die entsprechenden Syntax Diskussionen in der XAML-Sprachspezifikation dies nicht tun.For this reason, the remainder of discussion of syntax in this document will include references to the CLR type system, even though the equivalent syntax discussions in the XAML language specification do not. (Gemäß der XAML-sprach Spezifikations Ebene können XAML-Typen einem beliebigen anderen Typsystem zugeordnet werden, was nicht die CLR sein muss, aber dies erfordert die Erstellung und Verwendung eines anderen XAML-Parsers.)(Per the XAML language specification level, XAML types could be mapped to any other type system, which does not have to be the CLR, but that would require the creation and use of a different XAML parser.)

Member von Typen und Klassen VererbungMembers of Types and Class Inheritance

Eigenschaften und Ereignisse, die als XAML-Member eines WPFWPF Typs angezeigt werden, werden oft von Basis Typen geerbt.Properties and events as they appear as XAML members of a WPFWPF type are often inherited from base types. Sehen Sie sich beispielsweise Folgendes Beispiel <Button Background="Blue" .../>an:.For example, consider this example: <Button Background="Blue" .../>. Die Background -Eigenschaft ist keine sofort deklarierte Eigenschaft in Button der Klasse, wenn Sie die Klassendefinition, die Reflektionsergebnisse oder die Dokumentation betrachten.The Background property is not an immediately declared property on the Button class, if you were to look at the class definition, reflection results, or the documentation. Stattdessen wird von der-Basis Control Klasse geerbt. BackgroundInstead, Background is inherited from the base Control class.

Das Klassen Vererbungs Verhalten WPFWPF von XAML-Elementen ist eine bedeutende Abkehr von der durch das Schema erzwungene Interpretation von XML-Markup.The class inheritance behavior of WPFWPF XAML elements is a significant departure from a schema-enforced interpretation of XML markup. Die Klassen Vererbung kann komplex werden, insbesondere dann, wenn zwischen Basisklassen abstrakt sind oder wenn Schnittstellen beteiligt sind.Class inheritance can become complex, particularly when intermediate base classes are abstract, or when interfaces are involved. Dies ist ein Grund, warum der Satz von XAML-Elementen und deren zulässige Attribute schwierig und vollständig mit den Schema Typen, die normalerweise für XMLXML die Programmierung verwendet werden, wie z. b. DTD oder XSD-Format, darstellen kann.This is one reason that the set of XAML elements and their permissible attributes is difficult to represent accurately and completely using the schema types that are typically used for XMLXML programming, such as DTD or XSD format. Ein weiterer Grund ist, dass Erweiterbarkeits-und Typmapping-Features der XAML-Sprache selbst die Vollständigkeit jeder festgelegten Darstellung der zulässigen Typen und Member ausschließen.Another reason is that extensibility and type-mapping features of the XAML language itself preclude completeness of any fixed representation of the permissible types and members.

ObjektelementsyntaxObject Element Syntax

Die Objekt Element Syntax ist die XAML-Markup Syntax, die eine CLR-Klasse oder-Struktur durch Deklarieren eines XML-Elements instanziiert.Object element syntax is the XAML markup syntax that instantiates a CLR class or structure by declaring an XML element. Diese Syntax ähnelt der Element Syntax anderer Markup Sprachen, wie z. b. html.This syntax resembles the element syntax of other markup languages such as HTML. Die Objekt Element Syntax beginnt mit einer öffnende Spitze<Klammer (), gefolgt von dem Typnamen der Klasse oder Struktur, die instanziiert wird.Object element syntax begins with a left angle bracket (<), followed immediately by the type name of the class or structure being instantiated. 0 (null) oder mehr Leerzeichen können dem Typnamen folgen, und NULL oder mehr Attribute können auch für das Object-Element deklariert werden, wobei ein oder mehrere Leerzeichen das Paar Attribute Name = "Wert" trennen.Zero or more spaces can follow the type name, and zero or more attributes may also be declared on the object element, with one or more spaces separating each attribute name="value" pair. Schließlich muss einer der folgenden Punkte zutreffen:Finally, one of the following must be true:

  • Das Element und das Tag müssen mit einem Schrägstrich (/) geschlossen werden, gefolgt von einer rechten Spitze Klammer (>).The element and tag must be closed by a forward slash (/) followed immediately by a right angle bracket (>).

  • Das öffnende Tag muss durch eine schließende spitze Klammer (>) abgeschlossen werden.The opening tag must be completed by a right angle bracket (>). Andere Objekt Elemente, Eigenschaften Elemente oder innerer Text können dem öffnenden Tag folgen.Other object elements, property elements, or inner text, can follow the opening tag. Der Inhalt, der hier enthalten sein kann, wird in der Regel durch das Objektmodell des Elements eingeschränkt.Exactly what content may be contained here is typically constrained by the object model of the element. Das entsprechende schließende Tag für das Object-Element muss auch vorhanden sein, in ordnungsgemäßer Schachtelung und in Einklang mit anderen öffnenden und schließenden Tagpaaren.The equivalent closing tag for the object element must also exist, in proper nesting and balance with other opening and closing tag pairs.

XAML, wie von .NET implementiert, verfügt über eine Reihe von Regeln, die Objekt Elemente Typen, Attributen in Eigenschaften oder Ereignissen und XAML-Namespaces in CLR-Namespaces Plus Assembly zuordnen.XAML as implemented by .NET has a set of rules that map object elements into types, attributes into properties or events, and XAML namespaces to CLR namespaces plus assembly. Für WPF und .net werden XAML-Objekt Elemente .NET-Typen entsprechend den in referenzierten Assemblys definierten zugeordnet, und die Attribute werden den Membern dieser Typen zugeordnet.For WPF and .NET, XAML object elements map to .NET types as defined in referenced assemblies, and the attributes map to members of those types. Wenn Sie in XAML auf einen CLR-Typ verweisen, haben Sie auch Zugriff auf die geerbten Member dieses Typs.When you reference a CLR type in XAML, you have access to the inherited members of that type as well.

Beispielsweise ist das folgende Beispiel eine Objekt Element Syntax, die eine neue Instanz der Button -Klasse instanziiert und außerdem ein Name -Attribut und einen Wert für dieses Attribut angibt:For example, the following example is object element syntax that instantiates a new instance of the Button class, and also specifies a Name attribute and a value for that attribute:

<Button Name="CheckoutButton"/>

Das folgende Beispiel ist eine Objekt Element Syntax, die auch die Syntax der XAML-Inhalts Eigenschaft enthält.The following example is object element syntax that also includes XAML content property syntax. Der innere Text, der in enthalten ist, wird verwendet TextBox , Textum die XAML-Inhalts Eigenschaft festzulegen.The inner text contained within will be used to set the TextBox XAML content property, Text.

<TextBox>This is a Text Box</TextBox>

Inhalts ModelleContent Models

Eine Klasse unterstützt möglicherweise eine Verwendung als XAML-Objekt Element in Bezug auf die Syntax, dieses Element funktioniert jedoch nur ordnungsgemäß in einer Anwendung oder einer Seite, wenn es an einer erwarteten Position eines gesamten Inhalts Modells oder einer Elementstruktur platziert wird.A class might support a usage as a XAML object element in terms of the syntax, but that element will only function properly in an application or page when it is placed in an expected position of an overall content model or element tree. Beispielsweise sollte eine MenuItem in der Regel nur als MenuBase untergeordnetes Element einer abgeleiteten Klasse, z Menu. b., platziert werden.For example, a MenuItem should typically only be placed as a child of a MenuBase derived class such as Menu. Inhalts Modelle für bestimmte Elemente werden als Teil der Hinweise auf die Klassen Seiten für Steuerelemente und andere WPFWPF Klassen dokumentiert, die als XAML-Elemente verwendet werden können.Content models for specific elements are documented as part of the remarks on the class pages for controls and other WPFWPF classes that can be used as XAML elements.

Eigenschaften von Objekt ElementenProperties of Object Elements

Eigenschaften in XAML werden durch eine Vielzahl von Syntax Möglichkeiten festgelegt.Properties in XAML are set by a variety of possible syntaxes. Welche Syntax für eine bestimmte Eigenschaft verwendet werden kann, hängt von den zugrunde liegenden typsystemmerkmalen der Eigenschaft ab, die Sie festlegen.Which syntax can be used for a particular property will vary, based on the underlying type system characteristics of the property that you are setting.

Wenn Sie Werte für Eigenschaften festlegen, fügen Sie Objekten Funktionen oder Eigenschaften hinzu, wie Sie im Laufzeitobjekt Diagramm vorhanden sind.By setting values of properties, you add features or characteristics to objects as they exist in the run time object graph. Der ursprüngliche Zustand des erstellten Objekts aus einem-Objekt Element basiert auf dem Parameter losen konstruktorverhalten.The initial state of the created object from a object element is based on the parameterless constructor behavior. In der Regel verwendet Ihre Anwendung etwas anderes als eine vollständig Standard Instanz eines beliebigen Objekts.Typically, your application will use something other than a completely default instance of any given object.

Attributsyntax (Eigenschaften)Attribute Syntax (Properties)

Die Attribut Syntax ist die XAML-Markup Syntax, mit der ein Wert für eine Eigenschaft festgelegt wird, indem ein Attribut für ein vorhandenes Objekt Element deklariert wird.Attribute syntax is the XAML markup syntax that sets a value for a property by declaring an attribute on an existing object element. Der Attribut Name muss mit dem CLR-Elementnamen der-Eigenschaft der-Klasse, die das relevante Object-Element sichert, identisch sein.The attribute name must match the CLR member name of the property of the class that backs the relevant object element. Auf den Attributnamen folgt ein Zuweisungs Operator (=).The attribute name is followed by an assignment operator (=). Der Attribut Wert muss eine in Anführungszeichen eingeschlossene Zeichenfolge sein.The attribute value must be a string enclosed within quotes.

Hinweis

Sie können abwechselnde Anführungszeichen verwenden, um ein literales Anführungszeichen innerhalb eines Attributs zu platzieren.You can use alternating quotes to place a literal quotation mark within an attribute. Beispielsweise können Sie einfache Anführungszeichen als Mittel zum Deklarieren einer Zeichenfolge verwenden, die ein doppeltes Anführungszeichen enthält.For instance you can use single quotes as a means to declare a string that contains a double quote character within it. Unabhängig davon, ob Sie einfache oder doppelte Anführungszeichen verwenden, sollten Sie ein entsprechendes Paar zum Öffnen und Schließen der Zeichenfolge für den Attribut Wert verwenden.Whether you use single or double quotes, you should use a matching pair for opening and closing the attribute value string. Es gibt auch Escapesequenzen oder andere Techniken zum Umgehen von Zeichen Einschränkungen, die von einer bestimmten XAML-Syntax auferlegt werden.There are also escape sequences or other techniques available for working around character restrictions imposed by any particular XAML syntax. Siehe XML-Zeichen Entitäten und XAML.See XML Character Entities and XAML.

Damit eine Eigenschaft über die Attribut Syntax festgelegt werden kann, muss sie öffentlich sein und beschreibbar sein.In order to be set through attribute syntax, a property must be public and must be writeable. Der Wert der Eigenschaft im Unterstützungs-Typsystem muss ein Werttyp oder ein Verweistyp sein, der beim Zugriff auf den entsprechenden Sicherungstyp von einem XAML-Prozessor instanziiert oder referenziert werden kann.The value of the property in the backing type system must be a value type, or must be a reference type that can be instantiated or referenced by a XAML processor when accessing the relevant backing type.

Bei WPF-XAML-Ereignissen muss das Ereignis, auf das als Attribut Name verwiesen wird, öffentlich sein und über einen öffentlichen Delegaten verfügen.For WPF XAML events, the event that is referenced as the attribute name must be public and have a public delegate.

Die Eigenschaft oder das Ereignis muss ein Member der Klasse oder Struktur sein, die vom enthaltenden Objekt Element instanziiert wird.The property or event must be a member of the class or structure that is instantiated by the containing object element.

Verarbeiten von AttributwertenProcessing of Attribute Values

Der Zeichen folgen Wert, der in den öffnenden und schließenden Anführungszeichen enthalten ist, wird von einem XAML-Prozessor verarbeitet.The string value contained within the opening and closing quotation marks is processed by a XAML processor. Bei-Eigenschaften wird das Standard Verarbeitungs Verhalten durch den Typ der zugrunde liegenden CLR-Eigenschaft bestimmt.For properties, the default processing behavior is determined by the type of the underlying CLR property.

Der Attribut Wert wird mithilfe der folgenden Verarbeitungsreihenfolge von einem der folgenden Werte aufgefüllt:The attribute value is filled by one of the following, using this processing order:

  1. Wenn der XAML-Prozessor auf eine geschweifte Klammer oder ein Objekt Element trifft, das von MarkupExtensionabgeleitet wird, wird die referenzierte Markup Erweiterung zuerst ausgewertet, anstatt den Wert als Zeichenfolge zu verarbeiten, und das von der Markup Erweiterung zurückgegebene Objekt wird als Wert.If the XAML processor encounters a curly brace, or an object element that derives from MarkupExtension, then the referenced markup extension is evaluated first rather than processing the value as a string, and the object returned by the markup extension is used as the value. In vielen Fällen handelt es sich bei dem Objekt, das von einer Markup Erweiterung zurückgegeben wird, um einen Verweis auf ein vorhandenes Objekt oder um einen Ausdruck, der die Auswertung bis zur Laufzeit auswertet und kein neu instanziierenes Objekt ist.In many cases the object returned by a markup extension will be a reference to an existing object, or an expression that defers evaluation until run time, and is not a newly instantiated object.

  2. Wenn die Eigenschaft mit einem TypeConverterattributierten deklariert wird oder der Werttyp dieser Eigenschaft mit TypeConvertereinem attributierten deklariert wird, wird der Zeichen folgen Wert des Attributs als Konvertierungs Eingabe an den Typkonverter übermittelt, und der Konverter gibt einen neue Objektinstanz.If the property is declared with an attributed TypeConverter, or the value type of that property is declared with an attributed TypeConverter, the string value of the attribute is submitted to the type converter as a conversion input, and the converter will return a new object instance.

  3. Wenn keine TypeConvertervorhanden ist, wird versucht, eine direkte Konvertierung in den Eigenschaftentyp auszuführen.If there is no TypeConverter, a direct conversion to the property type is attempted. Diese abschließende Ebene ist eine direkte Konvertierung bei dem Parser-systemeigenen Wert zwischen XAML-sprach primitiven Typen oder eine Überprüfung der Namen von benannten Konstanten in einer Enumeration (der Parser greift dann auf die übereinstimmenden Werte zu).This final level is a direct conversion at the parser-native value between XAML language primitive types, or a check for the names of named constants in an enumeration (the parser then accesses the matching values).

EnumerationsattributwerteEnumeration Attribute Values

Enumerationen in XAML werden intrinsisch von XAML-Parser verarbeitet, und die Member einer Enumeration sollten durch Angabe des Zeichen folgen Namens einer der benannten Konstanten der Enumeration angegeben werden.Enumerations in XAML are processed intrinsically by XAML parsers, and the members of an enumeration should be specified by specifying the string name of one of the enumeration's named constants.

Für nicht-Flag-Enumerationswerte besteht das Native Verhalten darin, die Zeichenfolge eines Attribut Werts zu verarbeiten und in einen der Enumerationswerte aufzulösen.For nonflag enumeration values, the native behavior is to process the string of an attribute value and resolve it to one of the enumeration values. Sie geben die Enumeration nicht in der formatenumerationan. - Wert, wie im Code.You do not specify the enumeration in the format Enumeration.Value, as you do in code. Stattdessen geben Sie nur den Wertan, und die Enumeration wird durch den Typ der Eigenschaft abgeleitet, die Sie festlegen.Instead, you specify only Value, and Enumeration is inferred by the type of the property you are setting. Wenn Sie ein Attribut in der- Enumerationangeben. Wertformular , das nicht ordnungsgemäß aufgelöst wird.If you specify an attribute in the Enumeration.Value form, it will not resolve correctly.

Bei gekennzeichneten Enumerationen basiert das Verhalten auf der Enum.Parse -Methode.For flagwise enumerations, the behavior is based on the Enum.Parse method. Sie können mehrere Werte für eine flagweise Enumeration angeben, indem Sie die einzelnen Werte durch ein Komma voneinander trennen.You can specify multiple values for a flagwise enumeration by separating each value with a comma. Enumerationswerte, die nicht flagweise sind, können jedoch nicht kombiniert werden.However, you cannot combine enumeration values that are not flagwise. Beispielsweise können Sie nicht die Komma Syntax verwenden, um zu versuchen, Trigger eine zu erstellen, die mehrere Bedingungen einer Enumeration vom Typ nonflag bearbeitet:For instance, you cannot use the comma syntax to attempt to create a Trigger that acts on multiple conditions of a nonflag enumeration:

<!--This will not compile, because Visibility is not a flagwise enumeration.-->  
...  
<Trigger Property="Visibility" Value="Collapsed,Hidden">  
  <Setter ... />  
</Trigger>  
...  

Flagweise Enumerationen, die Attribute unterstützen, die in XAML festgelegt werden können, sind in WPF selten.Flagwise enumerations that support attributes that are settable in XAML are rare in WPF. Eine solche Enumeration ist StyleSimulationsjedoch.However, one such enumeration is StyleSimulations. Beispielsweise können Sie die durch Trennzeichen getrennte Flag-Attribut Syntax verwenden, um das in den Hinweisen für die Glyphs -Klasse bereitgestellte Beispiel zu ändern. StyleSimulations = "BoldSimulation" kann werden StyleSimulations = "BoldSimulation,ItalicSimulation".You could, for instance, use the comma-delimited flagwise attribute syntax to modify the example provided in the Remarks for the Glyphs class; StyleSimulations = "BoldSimulation" could become StyleSimulations = "BoldSimulation,ItalicSimulation". KeyBinding.Modifierseine andere Eigenschaft, bei der mehr als ein Enumerationswert angegeben werden kann.KeyBinding.Modifiers is another property where more than one enumeration value can be specified. Diese Eigenschaft ist jedoch ein Sonderfall, da die ModifierKeys Enumeration ihren eigenen Typkonverter unterstützt.However, this property happens to be a special case, because the ModifierKeys enumeration supports its own type converter. Der Typkonverter für Modifizierer verwendet ein Pluszeichen (+) als Trennzeichen anstelle eines Kommas (,).The type converter for modifiers uses a plus sign (+) as a delimiter rather than a comma (,). Diese Konvertierung unterstützt die herkömmlichere Syntax zur Darstellung von Tastenkombinationen in der Microsoft Windows-Programmierung, z. b. "Strg + Alt".This conversion supports the more traditional syntax to represent key combinations in Microsoft Windows programming, such as "Ctrl+Alt".

Verweise auf Eigenschaften und Namen von Ereignis MembernProperties and Event Member Name References

Wenn Sie ein Attribut angeben, können Sie auf eine beliebige Eigenschaft oder ein Ereignis verweisen, das als Member des CLR-Typs vorhanden ist, den Sie für das enthaltende Objekt Element instanziiert haben.When specifying an attribute, you can reference any property or event that exists as a member of the CLR type you instantiated for the containing object element.

Oder Sie können unabhängig vom enthaltenden Objekt Element auf eine angefügte Eigenschaft oder ein angefügtes Ereignis verweisen.Or, you can reference an attached property or attached event, independent of the containing object element. (Angefügte Eigenschaften werden in einem zukünftigen Abschnitt erläutert.)(Attached properties are discussed in an upcoming section.)

Sie können auch ein beliebiges Ereignis aus jedem Objekt benennen, auf das über den Standard Namespace miteinem Typnamen zugegriffen werden kann. teilweise qualifizierter Ereignis Name; Diese Syntax unterstützt das Anfügen von Handlern für Routing Ereignisse, bei denen der Handler das Routing von Ereignissen aus untergeordneten Elementen verarbeiten soll, aber das übergeordnete Element verfügt nicht auch über dieses Ereignis in der Members-Tabelle.You can also name any event from any object that is accessible through the default namespace by using a typeName.event partially qualified name; this syntax supports attaching handlers for routed events where the handler is intended to handle events routing from child elements, but the parent element does not also have that event in its members table. Diese Syntax ähnelt der Syntax des angefügten Ereignisses, aber das Ereignis hier ist kein true angefügtes Ereignis.This syntax resembles an attached event syntax, but the event here is not a true attached event. Stattdessen verweisen Sie auf ein Ereignis mit einem qualifizierten Namen.Instead, you are referencing an event with a qualified name. Weitere Informationen finden Sie unter Übersicht über Routing Ereignisse.For more information, see Routed Events Overview.

In einigen Szenarios werden Eigenschaftsnamen manchmal als Wert eines Attributs und nicht als Attribut Name bereitgestellt.For some scenarios, property names are sometimes provided as the value of an attribute, rather than the attribute name. Dieser Eigenschaftsname kann auch Qualifizierer einschließen, wie z. b. die Eigenschaft, die im Formular Besitzer Typeangegeben ist. dependencypropertyname.That property name can also include qualifiers, such as the property specified in the form ownerType.dependencyPropertyName. Dieses Szenario kommt häufig beim Schreiben von Stilen oder Vorlagen in XAML vor.This scenario is common when writing styles or templates in XAML. Die Verarbeitungs Regeln für Eigenschaftsnamen, die als Attribut Wert bereitgestellt werden, unterscheiden sich voneinander und werden durch den Typ der festzulegenden Eigenschaft oder durch das Verhalten bestimmter WPF-Subsysteme gesteuert.The processing rules for property names provided as an attribute value are different, and are governed by the type of the property being set or by the behaviors of particular WPF subsystems. Weitere Informationen finden Sie unter Erstellen von Formaten undVorlagen.For details, see Styling and Templating.

Eine weitere Verwendung für Eigenschaftsnamen ist, wenn ein Attribut Wert eine Eigenschafts Eigenschafts Beziehung beschreibt.Another usage for property names is when an attribute value describes a property-property relationship. Diese Funktion wird für die Datenbindung und für Storyboard-Ziele verwendet und wird durch die PropertyPath -Klasse und deren Typkonverter ermöglicht.This feature is used for data binding and for storyboard targets, and is enabled by the PropertyPath class and its type converter. Eine ausführlichere Beschreibung der Such Semantik finden Sie unter PropertyPath-XAML-Syntax.For a more complete description of the lookup semantics, see PropertyPath XAML Syntax.

Eigenschaftenelement-SyntaxProperty Element Syntax

Die Syntax von Eigenschafts Elementen ist eine Syntax, die von den grundlegenden XML-Syntax Regeln für Elemente abweicht.Property element syntax is a syntax that diverges somewhat from the basic XML syntax rules for elements. In XML ist der Wert eines Attributs eine de-facto-Zeichenfolge, wobei die einzige mögliche Variation darin besteht, welches Zeichen folgen Codierungsformat verwendet wird.In XML, the value of an attribute is a de facto string, with the only possible variation being which string encoding format is being used. In XAML können Sie andere Objekt Elemente als Wert einer Eigenschaft zuweisen.In XAML, you can assign other object elements to be the value of a property. Diese Funktion wird durch die Eigenschafts Element Syntax aktiviert.This capability is enabled by the property element syntax. Anstelle der Eigenschaft, die als Attribut innerhalb des Elementtags angegeben wird, wird die Eigenschaft mithilfe eines öffnenden Elementtags in elementtykenameangegeben. propertyName -Formular, der Wert der-Eigenschaft wird in angegeben, und dann wird das Property-Element geschlossen.Instead of the property being specified as an attribute within the element tag, the property is specified using an opening element tag in elementTypeName.propertyName form, the value of the property is specified within, and then the property element is closed.

Insbesondere beginnt die Syntax mit einer linken spitzen Klammer (<), gefolgt vom Typnamen der Klasse oder Struktur, in der die Eigenschafts Element Syntax enthalten ist.Specifically, the syntax begins with a left angle bracket (<), followed immediately by the type name of the class or structure that the property element syntax is contained within. Danach folgt ein einzelner Punkt (.), dann der Name einer Eigenschaft und dann eine Rechte Spitze Klammer (>).This is followed immediately by a single dot (.), then by the name of a property, then by a right angle bracket (>). Wie bei der Attribut Syntax muss diese Eigenschaft innerhalb der deklarierten öffentlichen Member des angegebenen Typs vorhanden sein.As with attribute syntax, that property must exist within the declared public members of the specified type. Der Wert, der der Eigenschaft zugewiesen werden soll, ist im Property-Element enthalten.The value to be assigned to the property is contained within the property element. In der Regel wird der Wert als ein oder mehrere Objekt Elemente angegeben, da die Angabe von Objekten als Werte das Szenario ist, mit dem die Eigenschaften Element Syntax adressiert werden soll.Typically, the value is given as one or more object elements, because specifying objects as values is the scenario that property element syntax is intended to address. Und schließlich ein entsprechendes Schließ Endes Tag, das denselben elementtykenameangibt. die Kombination aus propertyName muss bereitgestellt werden, und zwar in angemessener Schachtelung und mit anderen Element Tags.Finally, an equivalent closing tag specifying the same elementTypeName.propertyName combination must be provided, in proper nesting and balance with other element tags.

Beispielsweise ist die Syntax des Eigenschafts Elements für die ContextMenu -Eigenschaft Buttoneines.For example, the following is property element syntax for the ContextMenu property of a Button.

<Button>
  <Button.ContextMenu>
    <ContextMenu>
      <MenuItem Header="1">First item</MenuItem>
      <MenuItem Header="2">Second item</MenuItem>
    </ContextMenu>
  </Button.ContextMenu>
  Right-click me!</Button>

Der Wert in einem Property-Element kann auch als innerer Text angegeben werden, in Fällen, in denen der angegebene Eigenschaftentyp ein primitiver Werttyp (z String. b.) oder eine Enumeration ist, in der ein Name angegeben ist.The value within a property element can also be given as inner text, in cases where the property type being specified is a primitive value type, such as String, or an enumeration where a name is specified. Diese beiden Verwendungen sind etwas ungewöhnlich, da in jedem dieser Fälle auch eine einfachere Attribut Syntax verwendet werden kann.These two usages are somewhat uncommon, because each of these cases could also use a simpler attribute syntax. Ein Szenario zum Auffüllen eines Eigenschafts Elements mit einer Zeichenfolge ist für Eigenschaften, die nicht die XAML-Inhalts Eigenschaft sind, aber immer noch für die Darstellung von UI-Text verwendet werden, und bestimmte leer Raumelemente (z. b. Zeilen Vorschübe) müssen in diesem Benutzeroberflächen Text angezeigt werden.One scenario for filling a property element with a string is for properties that are not the XAML content property but still are used for representation of UI text, and particular white-space elements such as linefeeds are required to appear in that UI text. Die Attribut Syntax kann Linefeeds nicht beibehalten, aber die Syntax von Eigenschafts Elementen kann so lange sein, dass eine bedeutende Leerraum Beibehaltung aktiv ist (Ausführliche Informationen finden Sie unter Leerraum Verarbeitung in XAML).Attribute syntax cannot preserve linefeeds, but property element syntax can, so long as significant white-space preservation is active (for details, see White space processing in XAML). Ein anderes Szenario besteht darin, dass die x:UID-Direktive auf das Property-Element angewendet werden kann, wodurch der Wert in als Wert markiert wird, der in der WPF-Ausgabe-BAML oder in anderen Techniken lokalisiert werden soll.Another scenario is so that x:Uid Directive can be applied to the property element and thus mark the value within as a value that should be localized in the WPF output BAML or by other techniques.

Ein Property-Element wird nicht in der logischen WPF-Struktur dargestellt.A property element is not represented in the WPF logical tree. Ein Eigenschafts Element ist nur eine bestimmte Syntax zum Festlegen einer Eigenschaft, und ist kein Element, das eine Instanz oder ein Objekt unterstützt.A property element is just a particular syntax for setting a property, and is not an element that has an instance or object backing it. (Ausführliche Informationen zum Konzept der logischen Struktur finden Sie Unterstrukturen in WPF.)(For details on the logical tree concept, see Trees in WPF.)

Bei Eigenschaften, bei denen sowohl Attribut-als auch Eigenschafts Element Syntax unterstützt wird, weisen die beiden Syntaxen im allgemeinen dasselbe Ergebnis auf, obwohl Feinheiten wie die Leerraum Behandlung leicht zwischen Syntaxen variieren können.For properties where both attribute and property element syntax are supported, the two syntaxes generally have the same result, although subtleties such as white-space handling can vary slightly between syntaxes.

AuflistungssyntaxCollection Syntax

Die XAML-Spezifikation erfordert XAML-Prozessor Implementierungen, um Eigenschaften zu identifizieren, bei denen der Werttyp eine Auflistung ist.The XAML specification requires XAML processor implementations to identify properties where the value type is a collection. Die allgemeine Implementierung des XAML-Prozessors in .NET basiert auf verwaltetem Code und CLR und identifiziert Auflistungs Typen mit einem der folgenden:The general XAML processor implementation in .NET is based on managed code and the CLR, and it identifies collection types through one of the following:

Wenn der Typ einer Eigenschaft eine Auflistung ist, muss der abzurufende Auflistungstyp nicht im Markup als Objekt Element angegeben werden.If the type of a property is a collection, then the inferred collection type does not need to be specified in the markup as an object element. Stattdessen werden die Elemente, die als Elemente in der Auflistung dienen sollen, als ein oder mehrere untergeordnete Elemente des Property-Elements angegeben.Instead, the elements that are intended to become the items in the collection are specified as one or more child elements of the property element. Jedes dieser Elemente wird beim Laden zu einem Objekt ausgewertet und der Auflistung hinzugefügt, indem die Add -Methode der impliziten Auflistung aufgerufen wird.Each such item is evaluated to an object during loading and added to the collection by calling the Add method of the implied collection. Die Triggers -Eigenschaft von Style übernimmt z. b. den spezialisierten TriggerCollectionSammlungstyp IList, der implementiert.For example, the Triggers property of Style takes the specialized collection type TriggerCollection, which implements IList. Es ist nicht erforderlich, ein TriggerCollection -Objekt Element im Markup zu instanziieren.It is not necessary to instantiate a TriggerCollection object element in the markup. Stattdessen geben Sie Trigger ein oder mehrere Elemente als Elemente innerhalb des Style.Triggers Property-Elements an, Trigger wobei (oder eine abgeleitete Klasse) der Typ ist, der als Elementtyp für den stark typisierten und impliziten TriggerCollectionWert erwartet wird.Instead, you specify one or more Trigger items as elements within the Style.Triggers property element, where Trigger (or a derived class) is the type expected as the item type for the strongly typed and implicit TriggerCollection.

<Style x:Key="SpecialButton" TargetType="{x:Type Button}">
  <Style.Triggers>
    <Trigger Property="Button.IsMouseOver" Value="true">
      <Setter Property = "Background" Value="Red"/>
    </Trigger>
    <Trigger Property="Button.IsPressed" Value="true">
      <Setter Property = "Foreground" Value="Green"/>
    </Trigger>
  </Style.Triggers>
</Style>

Eine Eigenschaft kann sowohl ein Auflistungstyp als auch die XAML-Inhalts Eigenschaft für diesen Typ und die abgeleiteten Typen sein, die im nächsten Abschnitt dieses Themas erläutert werden.A property may be both a collection type and the XAML content property for that type and derived types, which is discussed in the next section of this topic.

Ein implizites Auflistungs Element erstellt ein Element in der logischen Struktur Darstellung, obwohl es nicht im Markup als Element angezeigt wird.An implicit collection element creates a member in the logical tree representation, even though it does not appear in the markup as an element. In der Regel führt der Konstruktor des übergeordneten Typs die Instanziierung für die Auflistung aus, die eine seiner Eigenschaften ist, und die anfänglich leere Auflistung wird Teil der Objektstruktur.Usually the constructor of the parent type performs the instantiation for the collection that is one of its properties, and the initially empty collection becomes part of the object tree.

Hinweis

Die generischen Listen-und WörterIList<T> Buch IDictionary<TKey,TValue>Schnittstellen (und) werden nicht für die Sammlungs Erkennung unterstützt.The generic list and dictionary interfaces (IList<T> and IDictionary<TKey,TValue>) are not supported for collection detection. Allerdings List<T> können Sie die-Klasse als Basisklasse verwenden, da Sie direkt implementiert IList , oder Dictionary<TKey,TValue> als Basisklasse, da Sie direkt implementiert IDictionary .However, you can use the List<T> class as a base class, because it implements IList directly, or Dictionary<TKey,TValue> as a base class, because it implements IDictionary directly.

In den .net-Referenzseiten für Auflistungs Typen wird diese Syntax gelegentlich in den XAML-Syntax Abschnitten als implizite Sammlungs Syntax angegeben.In the .NET Reference pages for collection types, this syntax with the deliberate omission of the object element for a collection is occasionally noted in the XAML syntax sections as Implicit Collection Syntax.

Mit Ausnahme des Root-Elements ist jedes Objekt Element in einer XAML-Datei, das als untergeordnetes Element eines anderen Elements eingebettet ist, tatsächlich ein Element, bei dem es sich um einen oder beide der folgenden Fälle handelt: ein Member einer impliziten Auflistungs Eigenschaft seines übergeordneten Elements. oder ein Element, das den Wert der XAML-Inhalts Eigenschaft für das übergeordnete Element angibt (XAML-Inhalts Eigenschaften werden in einem zukünftigen Abschnitt erläutert).With the exception of the root element, every object element in a XAML file that is nested as a child element of another element is really an element that is one or both of the following cases: a member of an implicit collection property of its parent element, or an element that specifies the value of the XAML content property for the parent element (XAML content properties will be discussed in an upcoming section). Anders ausgedrückt: die Beziehung zwischen übergeordneten Elementen und untergeordneten Elementen in einer Markup Seite ist tatsächlich ein einzelnes Objekt am Stamm, und jedes Objekt Element unterhalb des Stamms ist entweder eine einzelne Instanz, die einen Eigenschafts Wert des übergeordneten Elements oder eines der Elemente in einer Spalte bereitstellt. Lection, bei der es sich auch um einen Auflistungstyp-Eigenschafts Wert des übergeordneten handeltIn other words, the relationship of parent elements and child elements in a markup page is really a single object at the root, and every object element beneath the root is either a single instance that provides a property value of the parent, or one of the items within a collection that is also a collection-type property value of the parent. Dieses Single-root-Konzept ist in XML üblich und wird häufig durch das Verhalten von APIs verstärkt, die XAML wie Loadladen.This single-root concept is common with XML, and is frequently reinforced in the behavior of APIs that load XAML such as Load.

Das folgende Beispiel ist eine Syntax, bei der das Object-Element fürGradientStopCollectioneine Auflistung () explizit angegeben ist.The following example is a syntax with the object element for a collection (GradientStopCollection) specified explicitly.

<LinearGradientBrush>  
  <LinearGradientBrush.GradientStops>  
    <GradientStopCollection>  
      <GradientStop Offset="0.0" Color="Red" />  
      <GradientStop Offset="1.0" Color="Blue" />  
    </GradientStopCollection>  
  </LinearGradientBrush.GradientStops>  
</LinearGradientBrush>  

Beachten Sie, dass es nicht immer möglich ist, die Auflistung explizit zu deklarieren.Note that it is not always possible to explicitly declare the collection. Wenn Sie z. b. TriggerCollection versuchen, explizit im zuvor Triggers gezeigten Beispiel zu deklarieren, tritt ein Fehler auf.For instance, attempting to declare TriggerCollection explicitly in the previously shown Triggers example would fail. Die explizite Deklaration der Auflistung erfordert, dass die Auflistungs Klasse einen Parameter losen Konstruktor TriggerCollection unterstützen muss und keinen Parameter losen Konstruktor hat.Explicitly declaring the collection requires that the collection class must support a parameterless constructor, and TriggerCollection does not have a parameterless constructor.

XAML-InhaltseigenschaftenXAML Content Properties

Die ContentPropertyAttribute XAML-Inhalts Syntax ist eine Syntax, die nur für Klassen aktiviert ist, die als Teil ihrer Klassen Deklaration angeben.XAML content syntax is a syntax that is only enabled on classes that specify the ContentPropertyAttribute as part of their class declaration. Der ContentPropertyAttribute verweist auf den Eigenschaftsnamen, der die Content-Eigenschaft für diesen Elementtyp (einschließlich abgeleiteter Klassen) ist.The ContentPropertyAttribute references the property name that is the content property for that type of element (including derived classes). Bei der Verarbeitung durch einen XAML-Prozessor werden alle untergeordneten Elemente oder inneren Text, die zwischen den öffnenden und schließenden Tags des Object-Elements gefunden werden, dem Wert der XAML-Inhalts Eigenschaft für dieses Objekt zugewiesen.When processed by a XAML processor, any child elements or inner text that are found between the opening and closing tags of the object element will be assigned to be the value of the XAML content property for that object. Sie sind berechtigt, explizite Eigenschaften Elemente für die Content-Eigenschaft anzugeben. diese Verwendung wird jedoch im Allgemeinen nicht in den XAML-Syntax Abschnitten in der .net-Referenz aufgeführt.You are permitted to specify explicit property elements for the content property, but this usage is not generally shown in the XAML syntax sections in the .NET reference. Das explizite/ausführliche Verfahren hat einen gelegentlichen Wert für die Markup Übersichtlichkeit oder eine Frage des Markup Stils, aber in der Regel ist es eine Inhalts Eigenschaft, das Markup zu optimieren, sodass Elemente, die intuitiv als über-/unterordnungsweise als übergeordnetes Element verwandt sind, direkt eingefügt werden können.The explicit/verbose technique has occasional value for markup clarity or as a matter of markup style, but usually the intent of a content property is to streamline the markup so that elements that are intuitively related as parent-child can be nested directly. Eigenschaften Element Tags für andere Eigenschaften eines Elements werden nicht gemäß einer strengen XAML-Sprachdefinition als "Content" zugewiesen. Sie werden zuvor in der Verarbeitungsreihenfolge des XAML-Parsers verarbeitet und werden nicht als "Content" betrachtet.Property element tags for other properties on an element are not assigned as "content" per a strict XAML language definition; they are processed previously in the XAML parser's processing order and are not considered to be "content".

XAML-Inhalts Eigenschaftswerte müssen zusammenhängend sein.XAML Content Property Values Must Be Contiguous

Der Wert einer XAML-Inhalts Eigenschaft muss entweder vollständig vor oder vollständig nach allen anderen Eigenschafts Elementen für dieses Objekt Element angegeben werden.The value of a XAML content property must be given either entirely before or entirely after any other property elements on that object element. Dies gilt unabhängig davon, ob der Wert einer XAML-Inhalts Eigenschaft als Zeichenfolge oder als ein oder mehrere-Objekte angegeben wird.This is true whether the value of a XAML content property is specified as a string, or as one or more objects. Beispielsweise wird das folgende Markup nicht analysiert:For example, the following markup does not parse:

<Button>I am a   
  <Button.Background>Blue</Button.Background>  
  blue button</Button>  

Dies ist im Wesentlichen der Fall, wenn diese Syntax mithilfe der Eigenschafts Element Syntax für die Content-Eigenschaft explizit festgelegt wurde, dann wird die Content-Eigenschaft zweimal festgelegt:This is illegal essentially because if this syntax were made explicit by using property element syntax for the content property, then the content property would be set twice:

<Button>  
  <Button.Content>I am a </Button.Content>  
  <Button.Background>Blue</Button.Background>  
  <Button.Content> blue button</Button.Content>  
</Button>  

Ein ähnliches Beispiel ist, wenn die Content-Eigenschaft eine Auflistung ist und untergeordnete Elemente mit Eigenschafts Elementen vermischt werden:A similarly illegal example is if the content property is a collection, and child elements are interspersed with property elements:

<StackPanel>  
  <Button>This example</Button>  
  <StackPanel.Resources>  
    <SolidColorBrush x:Key="BlueBrush" Color="Blue"/>  
  </StackPanel.Resources>  
  <Button>... is illegal XAML</Button>  
</StackPanel>  

Inhaltseigenschaften und Auflistungssyntax in KombinationContent Properties and Collection Syntax Combined

Um mehr als ein einzelnes Objekt Element als Inhalt zu akzeptieren, muss der Typ der Inhalts Eigenschaft ein Sammlungstyp sein.In order to accept more than a single object element as content, the type of the content property must specifically be a collection type. Ähnlich wie bei der Eigenschafts Element Syntax für Auflistungs Typen müssen von einem XAML-Prozessortypen identifiziert werden, die Sammlungs Typen sind.Similar to property element syntax for collection types, a XAML processor must identify types that are collection types. Wenn ein Element über eine XAML-Inhalts Eigenschaft verfügt und der Typ der XAML-Inhalts Eigenschaft eine Auflistung ist, muss der implizite Sammlungstyp nicht im Markup als Objekt Element angegeben werden, und die XAML-Inhalts Eigenschaft muss nicht als Eigenschaft El angegeben werden. Ausrüstung.If an element has a XAML content property and the type of the XAML content property is a collection, then the implied collection type does not need to be specified in the markup as an object element and the XAML content property does not need to be specified as a property element. Daher kann dem offensichtlich Inhalts Modell im Markup nun mehr als ein untergeordnetes Element als Inhalt zugewiesen werden.Therefore the apparent content model in the markup can now have more than one child element assigned as the content. Im folgenden finden Sie eine Inhalts Syntax Panel für eine abgeleitete Klasse.The following is content syntax for a Panel derived class. Alle Panel abgeleiteten Klassen stellen die XAML-Inhalts Eigenschaft Childrenals dar, die einen Wert vom UIElementCollectionTyp erfordert.All Panel derived classes establish the XAML content property to be Children, which requires a value of type UIElementCollection.

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  >
  <StackPanel>
    <Button>Button 1</Button>
    <Button>Button 2</Button>
    <Button>Button 3</Button>
  </StackPanel>
</Page>

Beachten Sie, dass weder das Property Children -Element für noch das UIElementCollection -Element für das im Markup erforderlich ist.Note that neither the property element for Children nor the element for the UIElementCollection is required in the markup. Dies ist ein Entwurfs Feature von XAML, sodass rekursiv enthaltene Elemente, die UIUI eine definieren, intuitiver als eine Struktur von untergeordneten Elementen mit direkt über-und untergeordneten Element Beziehungen dargestellt werden, ohne dass es zwischenzeitliche Eigenschaften Element Tags oder Sammlungsobjekte.This is a design feature of XAML so that recursively contained elements that define a UIUI are more intuitively represented as a tree of nested elements with immediate parent-child element relationships, without intervening property element tags or collection objects. In der Tat UIElementCollection kann nicht explizit im Markup als Objekt Element explizit angegeben werden.In fact, UIElementCollection cannot be specified explicitly in markup as an object element, by design. Da die einzige beabsichtigte Verwendung als implizite Auflistung verwendet wird, UIElementCollection macht keinen öffentlichen Parameter losen Konstruktor verfügbar und kann daher nicht als Objekt Element instanziiert werden.Because its only intended use is as an implicit collection, UIElementCollection does not expose a public parameterless constructor and thus cannot be instantiated as an object element.

Mischen von Eigenschafts Elementen und Objekt Elementen in einem Objekt mit einer Content-EigenschaftMixing Property Elements and Object Elements in an Object with a Content Property

Die XAML-Spezifikation deklariert, dass ein XAML-Prozessor erzwingen kann, dass Objekt Elemente, die zum Ausfüllen der XAML-Inhalts Eigenschaft in einem Objekt Element verwendet werden, zusammenhängend sein müssen und nicht gemischt werden dürfen.The XAML specification declares that a XAML processor can enforce that object elements that are used to fill the XAML content property within an object element must be contiguous, and must not be mixed. Diese Einschränkung für das Mischen von Eigenschaften Elementen und Inhalten wird durch WPFWPF die XAML-Prozessoren erzwungen.This restriction against mixing property elements and content is enforced by the WPFWPF XAML processors.

Sie können ein untergeordnetes Object-Element als erstes unmittelbares Markup innerhalb eines Object-Elements haben.You can have a child object element as the first immediate markup within an object element. Anschließend können Sie Eigenschaften Elemente einführen.Then you can introduce property elements. Oder Sie können ein oder mehrere Eigenschaften Elemente, dann den Inhalt und dann weitere Eigenschaften Elemente angeben.Or, you can specify one or more property elements, then content, then more property elements. Wenn jedoch ein Eigenschaften Element auf den Inhalt folgt, können Sie keinen weiteren Inhalt einführen, Sie können nur Eigenschaften Elemente hinzufügen.But once a property element follows content, you cannot introduce any further content, you can only add property elements.

Diese Anforderungs Anforderung für Inhalt/Eigenschaften Element gilt nicht für inneren Text, der als Inhalt verwendet wird.This content / property element order requirement does not apply to inner text used as content. Allerdings ist es immer noch ein guter Markup Stil, um inneren Text zusammenhängend aufzubewahren, da es schwierig ist, im Markup visuell zu erkennen, wenn die Eigenschaften Elemente mit innerem Text miteinander vermischt werden.However, it is still a good markup style to keep inner text contiguous, because significant white space will be difficult to detect visually in the markup if property elements are interspersed with inner text.

XAML-NamespacesXAML Namespaces

Keines der vorangehenden Syntax Beispiele hat einen anderen XAML-Namespace als den standardmäßigen XAML-Namespace angegeben.None of the preceding syntax examples specified a XAML namespace other than the default XAML namespace. In typischen WPFWPF Anwendungen wird der XAML-Standard Namespace als WPFWPF Namespace angegeben.In typical WPFWPF applications, the default XAML namespace is specified to be the WPFWPF namespace. Sie können andere XAML-Namespaces als den standardmäßigen XAML-Namespace angeben und dennoch eine ähnliche Syntax verwenden.You can specify XAML namespaces other than the default XAML namespace and still use similar syntax. Wenn eine Klasse den Namen hat, auf die nicht innerhalb des standardmäßigen XAML-Namespace zugegriffen werden kann, muss dem Klassennamen jedoch das Präfix des XAML-Namespace vorangestellt sein, das dem entsprechenden CLR-Namespace zugeordnet ist.But then, anywhere where a class is named that is not accessible within the default XAML namespace, that class name must be preceded with the prefix of the XAML namespace as mapped to the corresponding CLR namespace. Beispielsweise <custom:Example/> ist eine Objekt Element Syntax zum Instanziieren einer Instanz Example der-Klasse, bei der der CLR-Namespace, der diese Klasse enthält (und möglicherweise die Informationen der externen Assembly, die Unterstützungs Typen enthalten) dem custom -Präfix.For example, <custom:Example/> is object element syntax to instantiate an instance of the Example class, where the CLR namespace containing that class (and possibly the external assembly information that contains backing types) was previously mapped to the custom prefix.

Weitere Informationen zu XAML-Namespaces finden Sie unter XAML-Namespaces und Namespace Zuordnung für WPF-XAML.For more information about XAML namespaces, see XAML Namespaces and Namespace Mapping for WPF XAML.

MarkuperweiterungenMarkup Extensions

XAML definiert eine Markup-Erweiterungs Programmier Entität, die einen Escapezeichen aus der normalen XAML-Prozessor Verarbeitung von Zeichen folgen Attributwerten oder Objekt Elementen ermöglicht und die Verarbeitung einer Unterstützungs Klasse zusichert.XAML defines a markup extension programming entity that enables an escape from the normal XAML processor handling of string attribute values or object elements, and defers the processing to a backing class. Das Zeichen, das eine Markup Erweiterung eines XAML-Prozessors identifiziert, wenn die Attribut Syntax verwendet wird, ist die öffnende geschweifte Klammer ({), gefolgt von einem beliebigen Zeichen, das keine schließende geschweifte Klammer (}) ist.The character that identifies a markup extension to a XAML processor when using attribute syntax is the opening curly brace ({), followed by any character other than a closing curly brace (}). Die erste Zeichenfolge, die auf die öffnende geschweifte Klammer folgt, muss auf die Klasse verweisen, die das jeweilige Erweiterungs Verhalten bereitstellt, wobei der Verweis die Teil Zeichenfolge "Extension" weglassen kann, wenn diese Teil Zeichenfolge Teil des echten Klassen namens ist.The first string following the opening curly brace must reference the class that provides the particular extension behavior, where the reference may omit the substring "Extension" if that substring is part of the true class name. Danach kann ein einzelnes Leerzeichen angezeigt werden, und dann wird jedes nachfolgende Zeichen als Eingabe von der Erweiterungs Implementierung verwendet, bis die schließende geschweifte Klammer gefunden wird.Thereafter, a single space may appear, and then each succeeding character is used as input by the extension implementation, up until the closing curly brace is encountered.

Die .net XAML-Implementierung verwendet MarkupExtension die abstrakte-Klasse als Grundlage für alle Markup Erweiterungen, die von WPFWPF unterstützt werden, sowie andere Frameworks oder Technologien.The .NET XAML implementation uses the MarkupExtension abstract class as the basis for all of the markup extensions supported by WPFWPF as well as other frameworks or technologies. Die WPFWPF speziell implementierten Markup Erweiterungen sind häufig dazu gedacht, eine Möglichkeit bereitzustellen, auf andere vorhandene Objekte zu verweisen, oder verzögerte Verweise auf Objekte zu erstellen, die zur Laufzeit ausgewertet werden.The markup extensions that WPFWPF specifically implements are often intended to provide a means to reference other existing objects, or to make deferred references to objects that will be evaluated at run time. Beispielsweise wird eine einfache WPF-Datenbindung durch Angabe der {Binding} Markup Erweiterung anstelle des Werts durchgeführt, den eine bestimmte Eigenschaft normalerweise annehmen würde.For example, a simple WPF data binding is accomplished by specifying the {Binding} markup extension in place of the value that a particular property would ordinarily take. Viele der WPF-Markup Erweiterungen ermöglichen eine Attribut Syntax für Eigenschaften, bei denen andernfalls eine Attribut Syntax nicht möglich wäre.Many of the WPF markup extensions enable an attribute syntax for properties where an attribute syntax would not otherwise be possible. Beispielsweise ist ein Style -Objekt ein relativ komplexer Typ, der eine Reihe von-Objekten und-Eigenschaften enthält.For example, a Style object is a relatively complex type that contains a nested series of objects and properties. Stile in WPF werden in der Regel als Ressource in einer ResourceDictionarydefiniert. Anschließend wird auf eine der beiden WPF-Markup Erweiterungen verwiesen, die eine Ressource anfordern.Styles in WPF are typically defined as a resource in a ResourceDictionary, and then referenced through one of the two WPF markup extensions that request a resource. Die Markup Erweiterung gibt die Auswertung des Eigenschafts Werts zu einer Ressourcen Suche zurück und ermöglicht die Bereitstellung des Werts der Style Eigenschaft, die den StyleTyp annimmt, in der Attribut Syntax, wie im folgenden Beispiel gezeigt:The markup extension defers the evaluation of the property value to a resource lookup and enables providing the value of the Style property, taking type Style, in attribute syntax as in the following example:

<Button Style="{StaticResource MyStyle}">My button</Button>

Hier identifiziert StaticResource die StaticResourceExtension -Klasse, die die Implementierung der Markup Erweiterung bereitstellt.Here, StaticResource identifies the StaticResourceExtension class providing the markup extension implementation. Die nächste Zeichen MyStyle Folge wird als Eingabe für den nicht Standardkonstruktor StaticResourceExtension verwendet, wobei der Parameter, der aus der Erweiterungs Zeichenfolge entnommen ResourceKeywurde, die angeforderte deklariert.The next string MyStyle is used as the input for the non-default StaticResourceExtension constructor, where the parameter as taken from the extension string declares the requested ResourceKey. MyStyleEs wird erwartet, dass es sich um den x:Key -Wert einer Style handelt, die als Ressource definiert ist.MyStyle is expected to be the x:Key value of a Style defined as a resource. Die Verwendung der statikresource-Markup Erweiterung fordert an, dass die Ressource verwendet Style wird, um den Eigenschafts Wert über die statische Ressourcen Suchlogik zur Ladezeit bereitzustellen.The StaticResource Markup Extension usage requests that the resource be used to provide the Style property value through static resource lookup logic at load time.

Weitere Informationen über Markuperweiterungen finden Sie unter Markuperweiterungen und WPF XAML.For more information about markup extensions, see Markup Extensions and WPF XAML. Einen Verweis auf Markup Erweiterungen und andere XAML-Programmierfunktionen, die in der allgemeinen .net XAML-Implementierung aktiviert sind, finden Sie unter XAML-Namespace (x:) Sprach Features.For a reference of markup extensions and other XAML programming features enabled in the general .NET XAML implementation, see XAML Namespace (x:) Language Features. Informationen zu WPF-spezifischen Markup Erweiterungen finden Sie unter WPF-XAML-Erweiterungen.For WPF-specific markup extensions, see WPF XAML Extensions.

Angefügte EigenschaftenAttached Properties

Angefügte Eigenschaften sind ein in XAML eingeführte Programmier Konzept, bei dem Eigenschaften im Besitz eines bestimmten Typs sein können, aber als Attribute oder Eigenschaften Elemente für jedes Element festgelegt werden.Attached properties are a programming concept introduced in XAML whereby properties can be owned and defined by a particular type, but set as attributes or property elements on any element. Das primäre Szenario, für das angefügte Eigenschaften vorgesehen sind, besteht darin, untergeordneten Elementen in einer Markup Struktur das Melden von Informationen an ein übergeordnetes Element zu ermöglichen, ohne dass ein umfassend frei gegebenes Objektmodell über alle Elemente hinwegThe primary scenario that attached properties are intended for is to enable child elements in a markup structure to report information to a parent element without requiring an extensively shared object model across all elements. Umgekehrt können von übergeordneten Elementen angefügte Eigenschaften verwendet werden, um Informationen an untergeordnete Elemente zu melden.Conversely, attached properties can be used by parent elements to report information to child elements. Weitere Informationen zum Zweck angefügter Eigenschaften und zum Erstellen eigener angefügter Eigenschaften finden Sie unter Übersicht über angefügte Eigenschaften.For more information on the purpose of attached properties and how to create your own attached properties, see Attached Properties Overview.

Angefügte Eigenschaften verwenden eine Syntax, die der Eigenschafts Element Syntax sehr ähnlich ist, da Sie auch einen Typnamenangeben. propertyName -Kombination.Attached properties use a syntax that superficially resembles property element syntax, in that you also specify a typeName.propertyName combination. Es gibt zwei wichtige Unterschiede:There are two important differences:

  • Sie können den Typnamenverwenden. propertyName -Kombination, auch wenn eine angefügte Eigenschaft durch Attribut Syntax festgelegt wird.You can use the typeName.propertyName combination even when setting an attached property through attribute syntax. Angefügte Eigenschaften sind der einzige Fall, bei dem das qualifizieren des Eigenschafts namens eine Anforderung in einer Attribut Syntax ist.Attached properties are the only case where qualifying the property name is a requirement in an attribute syntax.

  • Sie können auch die Eigenschaften Element Syntax für angefügte Eigenschaften verwenden.You can also use property element syntax for attached properties. Bei der typischen Eigenschafts Element Syntax ist der von Ihnen angegebene Typname jedoch das Object-Element, das das Property-Element enthält.However, for typical property element syntax, the typeName you specify is the object element that contains the property element. Wenn Sie auf eine angefügte Eigenschaft verweisen, ist der Typname die Klasse, die die angefügte Eigenschaft definiert, nicht das enthaltende Objekt Element.If you are referring to an attached property, then the typeName is the class that defines the attached property, not the containing object element.

Angefügte EreignisseAttached Events

Angefügte Ereignisse sind ein weiteres Programmier Konzept, das in XAML eingeführt wurde, in dem Ereignisse von einem bestimmten Typ definiert werden können, aber Handler können an jedes beliebige Objekt Element angefügt werden.Attached events are another programming concept introduced in XAML where events can be defined by a specific type, but handlers may be attached on any object element. In der WOF-Implementierung ist oft der Typ, der ein angefügtes Ereignis definiert, ein statischer Typ, der einen Dienst definiert, und manchmal werden diese angefügten Ereignisse von einem Alias Ereignis Alias in Typen verfügbar gemacht, die den Dienst verfügbar machen.In the WOF implementation, often the type that defines an attached event is a static type that defines a service, and sometimes those attached events are exposed by a routed event alias in types that expose the service. Handler für angefügte Ereignisse werden durch Attribut Syntax angegeben.Handlers for attached events are specified through attribute syntax. Wie bei angefügten Ereignissen wird die Attribut Syntax für angefügte Ereignisse so erweitert, dass ein Typnamezulässig ist. Verwendung von EventName , wobei tyadapame die Klasse ist, Add die Remove -Ereignishandleraccessoren für die angefügte Ereignis Infrastruktur bereitstellt, und EventName ist der Ereignis Name.As with attached events, the attribute syntax is expanded for attached events to allow a typeName.eventName usage, where typeName is the class that provides Add and Remove event handler accessors for the attached event infrastructure, and eventName is the event name.

Anatomie eines XAML-Stamm ElementsAnatomy of a XAML Root Element

Die folgende Tabelle zeigt ein typisches XAML-Stamm Element, das die spezifischen Attribute eines Stamm Elements anzeigt:The following table shows a typical XAML root element broken down, showing the specific attributes of a root element:

<Page Öffnen des Object-Elements des Root-ElementsOpening object element of the root element
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Der Standard-WPFWPFXAML-Namespace ()The default (WPFWPF) XAML namespace
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" XAML-Namespace der XAML-SpracheThe XAML language XAML namespace
x:Class="ExampleNamespace.ExampleCode" Die Deklaration der partiellen Klasse, die das Markup mit allen für die partiellen Klasse definierten Code Behind-Klassen verbindetThe partial class declaration that connects markup to any code-behind defined for the partial class
> Das Ende des Objekt Elements für den Stamm.End of object element for the root. Das Objekt ist noch nicht geschlossen, da das Element untergeordnete Elemente enthält.Object is not closed yet because the element contains child elements

Optionale und nicht empfohlene XAML-VerwendungenOptional and Nonrecommended XAML Usages

In den folgenden Abschnitten werden XAML-Verwendungen beschrieben, die in technischer Hinsicht von XAML-Prozessoren unterstützt werden, die jedoch ausführlichkeits-oder andere ästhetische Probleme mit sich bringen, die bei der Entwicklung von Anwendungen, die XAML-Quellen enthalten, eine Benutzer lesbare XAML-DateiThe following sections describe XAML usages that are technically supported by XAML processors, but that produce verbosity or other aesthetic issues that interfere with XAML files remaining human-readable when you develop applications that contain XAML sources.

Optionale Verwendung von Eigenschafts ElementenOptional Property Element Usages

Optionale Verwendung von Eigenschafts Elementen schließt das explizite Schreiben von Element Inhalts Eigenschaften ein, die vom XAML-Prozessor als implizit betrachtet werden.Optional property element usages include explicitly writing out element content properties that the XAML processor considers implicit. Wenn Sie z. b. Menuden Inhalt eines deklarieren, können Sie festlegen, dass die Items Auflistung von Menu explizit als <Menu.Items> Eigenschaftenelementtag deklariert wird, MenuItem und <Menu.Items>platzieren Sie jede in, anstatt als Verwenden des impliziten XAML-Prozessor Verhaltens, dass alle untergeordneten Menu Elemente eines- MenuItem Elements ein sein müssen und Items in der Auflistung platziert werden.For example, when you declare the contents of a Menu, you could choose to explicitly declare the Items collection of the Menu as a <Menu.Items> property element tag, and place each MenuItem within <Menu.Items>, rather than using the implicit XAML processor behavior that all child elements of a Menu must be a MenuItem and are placed in the Items collection. Manchmal können die optionalen Verwendungen dabei helfen, die Objektstruktur visuell zu verdeutlichen, wie im Markup dargestellt.Sometimes the optional usages can help to visually clarify the object structure as represented in the markup. Manchmal kann eine explizite Verwendung eines Eigenschafts Elements Markup vermeiden, das technisch funktional, aber visuell verwirrend ist, wie z. b. geschachtelte Markup Erweiterungen innerhalb eines Attribut Werts.Or sometimes an explicit property element usage can avoid markup that is technically functional but visually confusing, such as nested markup extensions within an attribute value.

Vollständige Typname. Mitgliedschafts Name qualifizierte AttributeFull typeName.memberName Qualified Attributes

Der Typname. das Formular für Mitgliedsnamen für ein Attribut funktioniert tatsächlich eher universell als nur der Routing Ereignis Fall.The typeName.memberName form for an attribute actually works more universally than just the routed event case. In anderen Situationen ist das Formular jedoch überflüssig, und Sie sollten es vermeiden, wenn dies nur aus Gründen der Markup-und Lesbarkeit erfolgt.But in other situations that form is superfluous and you should avoid it, if only for reasons of markup style and readability. Im folgenden Beispiel ist jeder der drei Verweise auf das Background -Attribut vollständig äquivalent:In the following example, each of the three references to the Background attribute are completely equivalent:

<Button Background="Blue">Background</Button>
<Button Button.Background="Blue">Button.Background</Button>
<Button Control.Background="Blue">Control.Background</Button>

Button.Backgroundfunktioniert, weil die qualifizierte Suche für diese Eigenschaft Button für erfolgreich ist (Background wurde von Control geerbt) und Button die Klasse des Object-Elements oder einer Basisklasse ist.Button.Background works because the qualified lookup for that property on Button is successful (Background was inherited from Control) and Button is the class of the object element or a base class. Control.Backgroundfunktioniert, weil Control die-Klasse Background tatsächlich Control definiert und Button eine Basisklasse ist.Control.Background works because the Control class actually defines Background and Control is a Button base class.

Der folgende Typnameist jedoch. das Formular für den Mitgliedsnamen funktioniert nicht und wird daher als kommentiert angezeigt:However, the following typeName.memberName form example does not work and is thus shown commented:

<!--<Button Label.Background="Blue">Does not work</Button> -->

Labelist eine andere abgeleitete ControlKlasse von, und wenn Sie Label.Background in einem Label -Objekt Element angegeben haben, hätte diese Verwendung funktioniert.Label is another derived class of Control, and if you had specified Label.Background within a Label object element, this usage would have worked. Da Label jedoch nicht die Klasse oder Basisklasse von Buttonist, wird das angegebene XAML-Prozessor Verhalten als angefügte Label.Background Eigenschaft verarbeitet.However, because Label is not the class or base class of Button, the specified XAML processor behavior is to then process Label.Background as an attached property. Label.Backgroundist keine verfügbare angefügte Eigenschaft, und diese Verwendung schlägt fehl.Label.Background is not an available attached property, and this usage fails.

basetypame. Membership Name-Eigenschafts ElementebaseTypeName.memberName Property Elements

Analog zur Art des Typnamens. das Formular für den Mitgliednamen funktioniert für die Attribut Syntax, einen basety-Name. die Syntax des Mitgliedschafts namens funktioniert für die Eigenschafts Element Syntax.In an analogous way to how the typeName.memberName form works for attribute syntax, a baseTypeName.memberName syntax works for property element syntax. Beispielsweise funktioniert die folgende Syntax:For instance, the following syntax works:

<Button>Control.Background PE
  <Control.Background>
    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
      <GradientStop Color="Yellow" Offset="0.0" />
      <GradientStop Color="LimeGreen" Offset="1.0" />
    </LinearGradientBrush>
    </Control.Background>
</Button>

Hier wurde das Property-Element als Control.Background angegeben, obwohl das Property-Element in Buttonenthalten war.Here, the property element was given as Control.Background even though the property element was contained in Button.

Aber genau wie tygtame. Formular für mitgliedschaftsnamen für Attribute, basetyname. der Name der Mitgliedschaft ist im Markup unzureichend, und Sie sollten ihn vermeiden.But just like typeName.memberName form for attributes, baseTypeName.memberName is poor style in markup, and you should avoid it.

Siehe auchSee also