Markuperweiterungen und WPF-XAMLMarkup Extensions and WPF XAML

Dieses Thema bietet eine Einführung das Konzept der Markuperweiterungen für XAML und enthält eine Erläuterung der Syntaxregeln, des Zweck und des zugrunde liegenden Klassenobjektmodels.This topic introduces the concept of markup extensions for XAML, including their syntax rules, purpose, and the class object model that underlies them. Markuperweiterungen sind eine allgemeine Funktion der XAML-Sprache und der .NET-Implementierung von XAML-Diensten.Markup extensions are a general feature of the XAML language and of the .NET implementation of XAML services. In diesem Thema werden speziell Markuperweiterungen zur Verwendung in WPF XAML beschrieben.This topic specifically details markup extensions for use in WPF XAML.

XAML-Prozessoren und MarkuperweiterungenXAML Processors and Markup Extensions

Im Allgemeinen kann ein XAML-Parser einen Attributwert entweder als Literalzeichenfolge interpretieren, die in eine Primitive konvertiert werden kann, oder auf bestimmte Weise in ein Objekt konvertieren.Generally speaking, a XAML parser can either interpret an attribute value as a literal string that can be converted to a primitive, or convert it to an object by some means. Eine Möglichkeit ist das Verweisen auf einen Typkonverter; dies wird im Thema TypeConverter und XAML dokumentiert.One such means is by referencing a type converter; this is documented in the topic TypeConverters and XAML. Bestimmte Szenarios erfordern jedoch ein anderes Verhalten.However, there are scenarios where different behavior is required. Ein XAML-Prozessor kann z.B. angewiesen werden, dass der Wert eines Attributs nicht zu einem neuen Objekt im Objektdiagramm führen soll.For example, a XAML processor can be instructed that a value of an attribute should not result in a new object in the object graph. Stattdessen soll das Attribut ein Objektdiagramm ergeben, das auf ein bereits erstelltes Objekt in einem anderen Teil des Diagramms oder auf ein statisches Objekt verweist.Instead, the attribute should result in an object graph that makes a reference to an already constructed object in another part of the graph, or a static object. Ein anderes Szenario ist, dass ein XAML-Prozessor angewiesen werden kann, Syntax zu verwenden, die für den Konstruktor eines Objekts nicht standardmäßige Argumente bereitstellt.Another scenario is that a XAML processor can be instructed to use a syntax that provides non-default arguments to the constructor of an object. Bei derartigen Szenarios eine Markuperweiterung die Lösung sein.These are the types of scenarios where a markup extension can provide the solution.

Grundlegende MarkuperweiterungssyntaxBasic Markup Extension Syntax

Eine Markuperweiterung kann zur Bereitstellung von Werten für Eigenschaften zur Verwendung von Attributen, für Eigenschaften zur Verwendung von Eigenschaftenelementen oder für beides implementiert werden.A markup extension can be implemented to provide values for properties in an attribute usage, properties in a property element usage, or both.

Wenn die Markuperweiterungssequenz zum Bereitstellen eines Attributwerts verwendet wird, wird dies durch die Verwendung von öffnenden und schließenden geschweiften Klammern ({ und }) in der Syntax für den XAML-Prozessor kenntlich gemacht.When used to provide an attribute value, the syntax that distinguishes a markup extension sequence to a XAML processor is the presence of the opening and closing curly braces ({ and }). Das Zeichenfolgentoken, das unmittelbar auf die öffnende geschweifte Klammer folgt, bestimmt den Typ der Markuperweiterung.The type of markup extension is then identified by the string token immediately following the opening curly brace.

Bei Verwendung in der Eigenschaftenelementsyntax entspricht das Erscheinungsbild der Markuperweiterung einem Element, das zum Bereitstellen eines Eigenschaftenelementwerts verwendet wird: eine XAML-Elementdeklaration, die auf die Markuperweiterungsklasse als Element verweist und von spitzen Klammern (<>) umschlossen ist.When used in property element syntax, a markup extension is visually the same as any other element used to provide a property element value: a XAML element declaration that references the markup extension class as an element, enclosed within angle brackets (<>).

XAML-definierte MarkuperweiterungenXAML-Defined Markup Extensions

Es gibt mehrere Markuperweiterungen, die nicht spezifisch für die WPF-Implementierung von XAML gelten, sondern Implementierungen für Interna oder Funktionen von XAML als Sprache sind.Several markup extensions exist that are not specific to the WPF implementation of XAML, but are instead implementations of intrinsics or features of XAML as a language. Diese Markuperweiterungen werden als Teil der allgemeinen .NET Framework-XAML-Dienste in der System.Xaml-Assembly implementiert und sind im XAML-Sprachnamespace enthalten.These markup extensions are implemented in the System.Xaml assembly as part of the general .NET Framework XAML services, and are within the XAML language XAML namespace. Im Hinblick auf die allgemeine Markupverwendung sind diese Markuperweiterungen in der Regel durch das x:-Präfix in der Verwendung identifizierbar.In terms of common markup usage, these markup extensions are typically identifiable by the x: prefix in the usage. Die MarkupExtension Basisklasse (auch in System.Xaml definiert) stellt das Muster, das alle Markuperweiterungen verwendet werden soll, damit er in der XAML-Readern und XAML-Writern, einschließlich in WPF XAML unterstützt werden.The MarkupExtension base class (also defined in System.Xaml) provides the pattern that all markup extensions should use in order to be supported in XAML readers and XAML writers, including in WPF XAML.

  • x:Type stellt das Type -Objekt für den benannten Typ bereit.x:Type supplies the Type object for the named type. Diese Funktion wird am häufigsten in Stilen und Vorlagen verwendet.This facility is used most frequently in styles and templates. Weitere Informationen finden Sie unter x:Type-Markuperweiterung.For details, see x:Type Markup Extension.

  • x:Static erzeugt statische Werte.x:Static produces static values. Die Werte stammen aus Wert-Typ-Codeentitäten, die nicht direkt dem Typ eines Zieleigenschaftswerts entsprechen, jedoch diesem Typ entsprechend ausgewertet werden können.The values come from value-type code entities that are not directly the type of a target property's value, but can be evaluated to that type. Weitere Informationen finden Sie unter x:Statische Markuperweiterung.For details, see x:Static Markup Extension.

  • x:Null gibt null als Wert für eine Eigenschaft an und kann für Attribute oder Eigenschaftenelementwerte verwendet werden.x:Null specifies null as a value for a property and can be used either for attributes or property element values. Weitere Informationen finden Sie unter x:Null-Markuperweiterung.For details, see x:Null Markup Extension.

  • x:Array bietet Unterstützung für die Erstellung von allgemeinen Arrays in XAML-Syntax, wenn die Auflistungsunterstützung von WPF-Basiselementen und Steuerelementmodellen bewusst nicht verwendet wird.x:Array provides support for creation of general arrays in XAML syntax, for cases where the collection support provided by WPF base elements and control models is deliberately not used. Weitere Informationen finden Sie unter x:Array-Markuperweiterung.For details, see x:Array Markup Extension.

Hinweis

Das x:-Präfix wird für die typische XAML-Namespacezuordnung der systeminternen XAML-Sprache im Stammelement einer XAML-Datei oder Produktion verwendet.The x: prefix is used for the typical XAML namespace mapping of the XAML language intrinsics, in the root element of a XAML file or production. Beispielsweise initiieren die Visual Studio-Vorlagen für WPF-Anwendungen eine XAML-Datei, die mithilfe dieser x: Zuordnung.For example, the Visual Studio templates for WPF applications initiate a XAML file using this x: mapping. Sie können ein anderes Präfixtoken in Ihrer eigenen XAML-Namespacezuordnung auswählen, dieser Dokumentation wird jedoch die x:-Standardzuordnung für die Identifizierung der Entitäten zugrunde gelegt, die als Teil des XAML-Sprachnamespace definiert sind (im Gegensatz zu einem standardmäßigen WPF-Namespace oder anderen XAML-Namespaces, die keinem bestimmten Framework zugeordnet sind).You could choose a different prefix token in your own XAML namespace mapping, but this documentation will assume the default x: mapping as a means of identifying those entities that are a defined part of the XAML namespace for the XAML language, as opposed to the WPF default namespace or other XAML namespaces not related to a specific framework.

WPF-spezifische MarkuperweiterungenWPF-Specific Markup Extensions

Bei der WPF-Programmierung werden am häufigsten die Markuperweiterungen mit Unterstützung für Ressourcenverweise (StaticResource und DynamicResource), und mit Unterstützung für Datenbindung verwendet (Binding).The most common markup extensions used in WPF programming are those that support resource references (StaticResource and DynamicResource), and those that support data binding (Binding).

  • StaticResource stellt einen Wert für eine Eigenschaft bereit, indem der Wert einer bereits definierten Ressource ersetzt wird.StaticResource provides a value for a property by substituting the value of an already defined resource. Schließlich wird eine StaticResource-Auswertung zur der XAML-Ladezeit vorgenommen, die während der tatsächlichen Laufzeit keinen Zugriff auf das Objektdiagramm hat.A StaticResource evaluation is ultimately made at XAML load time and does not have access to the object graph at run time. Weitere Informationen finden Sie unter StaticResource-MarkuperweiterungFor details, see StaticResource Markup Extension.

  • DynamicResource stellt einen Wert für eine Eigenschaft bereit, indem dieser Wert als Laufzeitverweis auf eine Ressource verwendet wird.DynamicResource provides a value for a property by deferring that value to be a run-time reference to a resource. Ein dynamischer Ressourcenverweis erzwingt jedes Mal eine neue Suche, wenn auf eine solche Ressource zugegriffen wird und diese zur Laufzeit Zugriff auf das Objektdiagramm hat.A dynamic resource reference forces a new lookup each time that such a resource is accessed and has access to the object graph at run time. Um diesen Zugriff abzurufen, wird das DynamicResource Konzept von Abhängigkeitseigenschaften im WPF-Eigenschaftensystem und ausgewerteten Ausdrücken unterstützt.In order to get this access, DynamicResource concept is supported by dependency properties in the WPF property system, and evaluated expressions. Daher kann DynamicResource nur für ein Abhängigkeitseigenschaftsziel verwendet werden.Therefore you can only use DynamicResource for a dependency property target. Weitere Informationen finden Sie unter DynamicResource-MarkuperweiterungFor details, see DynamicResource Markup Extension.

  • Binding stellt einen datengebundenen Wert für eine Eigenschaft bereit, indem der Datenkontext verwendet wird, der zur Laufzeit für das übergeordnete Objekt gilt.Binding provides a data bound value for a property, using the data context that applies to the parent object at run time. Diese Markuperweiterung ist relativ komplex, da eine komplexe Inlinesyntax für die Angabe einer Datenbindung aktiviert wird.This markup extension is relatively complex, because it enables a substantial inline syntax for specifying a data binding. Weitere Informationen finden Sie unter Binding als Markuperweiterung.For details, see Binding Markup Extension.

  • RelativeSource Stellt Quellinformationen für eine Binding können, die mehrere mögliche Beziehungen in der Laufzeit-Objektstruktur navigieren.RelativeSource provides source information for a Binding that can navigate several possible relationships in the run-time object tree. Hierdurch werden spezielle Quellbezüge für Bindungen bereitgestellt, die ohne vollständige Kenntnis der umgebenden Objektstruktur in Mehrzweckvorlagen oder in Code erstellt werden.This provides specialized sourcing for bindings that are created in multi-use templates or created in code without full knowledge of the surrounding object tree. Weitere Informationen finden Sie unter RelativeSource-Markuperweiterungen.For details, see RelativeSource MarkupExtension.

  • TemplateBinding ermöglicht die Verwendung von Vorlage-Eigenschaftswerten in Steuerelementvorlagen, die von den durch das Objektmodell definierten Eigenschaften der Klasse stammen, die die Vorlage verwenden werden.TemplateBinding enables a control template to use values for templated properties that come from object-model-defined properties of the class that will use the template. Dies bedeutet, dass die Eigenschaft in der Vorlagendefinition auf einen Kontext zugreifen kann, der erst vorhanden ist, wenn die Vorlage angewendet wird.In other words, the property within the template definition can access a context that only exists once the template is applied. Weitere Informationen finden Sie unter TemplateBinding Markuperweiterung.For details, see TemplateBinding Markup Extension. Weitere Informationen über die praktische Verwendung von TemplateBinding, finden Sie unter Beispiel zum Formatieren mit ControlTemplates.For more information on the practical use of TemplateBinding, see Styling with ControlTemplates Sample.

  • ColorConvertedBitmap unterstützt ein relativ komplexes Bildverarbeitungsszenario.ColorConvertedBitmap supports a relatively advanced imaging scenario. Weitere Informationen finden Sie unter ColorConvertedBitmap-MarkuperweiterungFor details, see ColorConvertedBitmap Markup Extension.

  • ComponentResourceKey und ThemeDictionary unterstützen Aspekte der Ressourcensuche, insbesondere für Ressourcen und Designs, mit benutzerdefinierten Steuerelementen enthalten sind.ComponentResourceKey and ThemeDictionary support aspects of resource lookup, particularly for resources and themes that are packaged with custom controls. Weitere Informationen finden Sie unter ComponentResourceKey-Markuperweiterung, ThemeDictionary-Markuperweiterung, oder Übersicht über das Erstellen von Steuerelementen.For more information, see ComponentResourceKey Markup Extension, ThemeDictionary Markup Extension, or Control Authoring Overview.

*Erweiterungsklassen*Extension Classes

Für die allgemeine XAML-Sprache und WPF-spezifischen Markuperweiterungen wird das Verhalten der einzelnen Markuperweiterungen für einen XAML-Prozessor über identifiziert eine *Extension abgeleitete Klasse MarkupExtension, und stellt eine Implementierung der ProvideValue -Methode.For both the general XAML language and WPF-specific markup extensions, the behavior of each markup extension is identified to a XAML processor through a *Extension class that derives from MarkupExtension, and provides an implementation of the ProvideValue method. Diese für jede Erweiterung verwendete Methode stellt das Objekt bereit, das bei der Auswertung der Markuperweiterung zurückgegeben wirdThis method on each extension provides the object that is returned when the markup extension is evaluated. Das zurückgegebene Objekt wird normalerweise auf Grundlage der verschiedenen Zeichenfolgentoken ausgewertet, die an die Markuperweiterung übergeben werden.The returned object is typically evaluated based on the various string tokens that are passed to the markup extension.

Z. B. die StaticResourceExtension Klasse stellt die Oberfläche Implementierung der tatsächlichen Ressourcensuche bereit, damit die ProvideValue Implementierung gibt das Objekt, das angefordert wird, mit der Eingabe dieser Implementierung wird eine Zeichenfolge, die verwendet wird, zurück. Suchen Sie die Ressource durch seine x:Key.For example, the StaticResourceExtension class provides the surface implementation of actual resource lookup so that its ProvideValue implementation returns the object that is requested, with the input of that particular implementation being a string that is used to look up the resource by its x:Key. Ein großer Teil dieser Implementierungsdetails ist nicht von Bedeutung, wenn Sie eine bestehende Markuperweiterung verwenden.Much of this implementation detail is unimportant if you are using an existing markup extension.

Einige Markuperweiterungen verwenden keine Zeichenfolgentokenargumente.Some markup extensions do not use string token arguments. Dies ist darauf zurückzuführen, dass sie einen statischen oder konsistenten Wert zurückgeben, oder darauf, dass der Kontext zum Bestimmen des zurückzugebenden Werts mit einem der durch den serviceProvider-Parameter übergebenen Dienste verfügbar ist.This is either because they return a static or consistent value, or because context for what value should be returned is available through one of the services passed through the serviceProvider parameter.

Das *Extension-Namensmuster dient der besseren Übersichtlichkeit und Konsistenz.The *Extension naming pattern is for convenience and consistency. Es ist nicht erforderlich, damit ein XAML-Prozessor diese Klasse als Unterstützung für eine Markuperweiterung identifiziert.It is not necessary in order for a XAML processor to identify that class as support for a markup extension. Solange Ihre Codebasis "System.xaml" enthält und .NET Framework-XAML-dienstimplementierungen verwendet werden, ist alles erkannt werden, wie eine XAML-Markuperweiterung ist eine Ableitung MarkupExtension und Konstruktionssyntax unterstützen.So long as your codebase includes System.Xaml and uses .NET Framework XAML Services implementations, all that is necessary to be recognized as a XAML markup extension is to derive from MarkupExtension and to support a construction syntax. WPF definiert Markup Extension-Klassen, die nicht folgen der *Extension Benennungsmuster, z. B. Binding.WPF defines markup extension-enabling classes that do not follow the *Extension naming pattern, for example Binding. Der Grund hierfür ist normalerweise, dass die Klasse Szenarios unterstützt, die über die reine Unterstützung von Markuperweiterungen hinausgehen.Typically the reason for this is that the class supports scenarios beyond pure markup extension support. Im Fall von Binding, Klasse Run-Time-Zugriff auf Methoden und Eigenschaften des Objekts für Szenarien unterstützt, die nichts mit XAML zu tun haben.In the case of Binding, that class supports run-time access to methods and properties of the object for scenarios that have nothing to do with XAML.

Erweiterungsklasse – Interpretation der InitialisierungstextExtension Class Interpretation of Initialization Text

Die Zeichenfolgentoken, die auf den Namen der Markuperweiterung folgen und sich innerhalb der Klammern befinden, werden von einem XAML-Prozessor auf eine der folgenden Arten interpretiert:The string tokens following the markup extension name and still within the braces are interpreted by a XAML processor in one of the following ways:

  • Ein Komma fungiert immer als Trennzeichen einzelner Token.A comma always represents the separator or delimiter of individual tokens.

  • Wenn die einzelnen getrennten Token keine Gleichheitszeichen enthalten, wird jedes Token als Konstruktorargument behandelt.If the individual separated tokens do not contain any equals signs, each token is treated as a constructor argument. Jeder Konstruktorparameter muss als Typ angegeben werden, der von der Signatur erwartet wird, und die Angabe muss in der von der Signatur erwarteten Reihenfolge erfolgen.Each constructor parameter must be given as the type expected by that signature, and in the proper order expected by that signature.

    Hinweis

    Ein XAML-Prozessor muss den Konstruktor aufrufen, der der Argumentanzahl der Anzahl von Paaren entspricht.A XAML processor must call the constructor that matches the argument count of the number of pairs. Aus diesem Grund Wenn Sie eine benutzerdefinierte Markuperweiterung implementieren, geben Sie nicht mehrere Konstruktoren mit derselben Argumentanzahl.For this reason, if you are implementing a custom markup extension, do not provide multiple constructors with the same argument count. Das Verhalten eines XAML-Prozessors, wenn mehrere Konstruktorpfade der Markuperweiterung mit derselben Parameteranzahl vorhanden sind, ist nicht definiert. Sie sollten jedoch davon ausgehen, dass ein XAML-Prozessor eine Ausnahme auslösen kann, wenn diese Situation in den Typdefinitionen der Markuperweiterung vorliegt.The behavior for how a XAML processor behaves if more than one markup extension constructor path with the same parameter count exists is not defined, but you should anticipate that a XAML processor is permitted to throw an exception on usage if this situation exists in the markup extension type definitions.

  • Wenn die einzelnen Token Gleichheitszeichen enthalten, ruft der XAML-Prozessor zuerst den Standardkonstruktor für die Markuperweiterung auf.If the individual separated tokens contain equals signs, then a XAML processor first calls the default constructor for the markup extension. Dann wird jedes Name=Wert-Paar als in der Markuperweiterung vorhandener Eigenschaftenname und als Wert interpretiert, der der Eigenschaft zuzuweisen ist.Then, each name=value pair is interpreted as a property name that exists on the markup extension, and a value to assign to that property.

  • Wenn in einer Markuperweiterung ein paralleles Ergebnis zwischen dem Konstruktorverhalten und dem Verhalten der Eigenschafteneinstellung vorliegt, können Sie zwischen den Verhalten wählen.If there is a parallel result between the constructor behavior and the property setting behavior in a markup extension, it does not matter which behavior you use. Wenn in einer Markuperweiterung ein paralleles Ergebnis zwischen dem Konstruktorverhalten und dem Verhalten der Eigenschafteneinstellung vorliegt, können Sie zwischen den Verhalten wählen. Die Verwendung von Eigenschaft=Wert-Paaren mit mehreren festlegbaren Eigenschaften für Markuperweiterungen ist gängiger, da hierbei ein geringeres Risiko besteht, Konstruktorparameter versehentlich zu vertauschen.It is more common usage to use the property=value pairs for markup extensions that have more than one settable property, if only because it makes your markup more intentional and you are less likely to accidentally transpose constructor parameters. (Bei der Angabe von Eigenschaft=Wert-Paaren spielt die Reihenfolge der Eigenschaften keine Rolle). Des Weiteren ist nicht garantiert, dass eine Markuperweiterung einen Konstruktorparameter angibt, der alle festlegbaren Eigenschaften festlegt.(When you specify property=value pairs, those properties may be in any order.) Also, there is no guarantee that a markup extension supplies a constructor parameter that sets every one of its settable properties. Z. B. Binding ist eine Markuperweiterung mit vielen Eigenschaften, die durch die Erweiterung in festlegbar sind Eigenschaft=Wert Formular jedoch Binding unterstützt nur zwei Konstruktoren: einen Standardkonstruktor und, der einen Anfangspfad festlegt.For example, Binding is a markup extension, with many properties that are settable through the extension in property=value form, but Binding only supports two constructors: a default constructor, and one that sets an initial path.

  • Ein Komma kann nicht ohne Vorschub als Literalzeichen an eine Markuperweiterung übergeben werden.A literal comma cannot be passed to a markup extension without escapement.

Escapesequenzen und MarkuperweiterungenEscape Sequences and Markup Extensions

Bei der Attributbehandlung in einem XAML-Prozessor werden geschweifte Klammern als Bezeichner für Markuperweiterungssequenzen verwendet.Attribute handling in a XAML processor uses the curly braces as indicators of a markup extension sequence. Falls erforderlich, können Sie geschweifte Klammern als Literalzeichen angeben, indem Sie eine Escapesequenz in Form eines leeren Paars geschweifter Klammern gefolgt von der literalen geschweiften Klammer angeben.It is also possible to produce a literal curly brace character attribute value if necessary, by entering an escape sequence using an empty curly brace pair followed by the literal curly brace. Finden Sie unter {} Escapesequenz - Markuperweiterung.See {} Escape Sequence - Markup Extension.

Schachtelung von Markuperweiterungen in der XAML-VerwendungNesting Markup Extensions in XAML Usage

Schachtelung mehrerer Markuperweiterungen wird unterstützt, und jeder Markuperweiterung wird tiefsten zuerst ausgewertet.Nesting of multiple markup extensions is supported, and each markup extension will be evaluated deepest first. Betrachten Sie z.B. die folgende Syntax:For example, consider the following usage:

<Setter Property="Background"  
  Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />  

Die x:Static-Anweisung wird hier zuerst ausgewertet und gibt eine Zeichenfolge zurück.In this usage, the x:Static statement is evaluated first and returns a string. Diese Zeichenfolge wird dann als Argument für DynamicResource verwendet.That string is then used as the argument for DynamicResource.

Markuperweiterungen und EigenschaftenelementsyntaxMarkup Extensions and Property Element Syntax

Bei Verwendung als Objektelement, das in einen Eigenschaftenelementwert geladen wird, ist eine Markuperweiterungsklasse visuell nicht von regulären typgestützten Objekten zu unterscheiden, die in XAML verwendet werden können.When used as an object element that fills a property element value, a markup extension class is visually indistinguishable from a typical type-backed object element that can be used in XAML. In diesem Fall besteht der praktische Unterschied zwischen einem typischen Objektelement und einer Markuperweiterung darin, dass die Markuperweiterung entweder als typisierter Wert ausgewertet oder als Ausdruck verzögert wird.The practical difference between a typical object element and a markup extension is that the markup extension is either evaluated to a typed value or deferred as an expression. Aus diesem Grund unterscheiden sich die Mechanismen für mögliche Typfehler bei Eigenschaftswerten für die Markuperweiterung. Dies ist mit der Behandlung einer Eigenschaft mit später Bindung in anderen Programmiermodellen vergleichbar.Therefore the mechanisms for any possible type errors of property values for the markup extension will be different, similar to how a late-bound property is treated in other programming models. Ein normales Objektelement wird beim Analysieren des XAML hinsichtlich der Typübereinstimmung mit der von ihm festgelegten Zieleigenschaft ausgewertet.An ordinary object element will be evaluated for type match against the target property it is setting when the XAML is parsed.

Die meisten Markuperweiterungen würden keinen Inhalt oder weitere Eigenschaftenelementsyntax aufweisen, wenn sie in der Objektelementsyntax in ein Eigenschaftenelement geladen werden.Most markup extensions, when used in object element syntax to fill a property element, would not have content or any further property element syntax within. Deshalb würden Sie das Objektelementtag schließen und keine untergeordneten Elemente bereitstellen.Thus you would close the object element tag, and provide no child elements. Wenn ein Objektelement von einem XAML-Prozessor erkannt wird, wird der Konstruktor für diese Klasse aufgerufen, die das aus dem analysierten Element erstellte Objekt instanziiert.Whenever any object element is encountered by a XAML processor, the constructor for that class is called, which instantiates the object created from the parsed element. Dies gilt auch für Markuperweiterungsklassen. Wenn Sie die Markuperweiterung in Objektelementsyntax verwenden möchten, müssen Sie einen Standardkonstruktor angeben.A markup extension class is no different: if you want your markup extension to be usable in object element syntax, you must provide a default constructor. Einige vorhandene Markuperweiterungen verfügen über mindestens einen erforderlichen Eigenschaftswert, der für die effektive Initialisierung angegeben werden muss.Some existing markup extensions have at least one required property value that must be specified for effective initialization. Wenn dies der Fall ist, wird dieser Eigenschaftswert in der Regel als Eigenschaftenattribut für das Objektelement angegeben.If so, that property value is typically given as a property attribute on the object element. In der XAML-Namespace (x:)) Sprachfunktionen und WPF-XAML-Erweiterungen auf den Referenzseiten Markup Extensions, die erforderlichen Eigenschaften (und die Namen der erforderlichen Eigenschaften) gekennzeichnet.In the XAML Namespace (x:) Language Features and WPF XAML Extensions reference pages, markup extensions that have required properties (and the names of required properties) will be noted. Des Weiteren wird auf den Referenzseiten darauf hingewiesen, wenn Objektelementsyntax oder Attributsyntax von einer Markuperweiterung nicht unterstützt werden.Reference pages will also note if either object element syntax or attribute syntax is disallowed for particular markup extensions. Ein wichtiger Fall ist X: Array-Markuperweiterung, die Attributsyntax nicht unterstützt, da der Inhalt des Arrays innerhalb der Tags als Inhalt angegeben werden muss.A notable case is x:Array Markup Extension, which cannot support attribute syntax because the contents of that array must be specified within the tagging as content. Die Arrayinhalte werden als allgemeine Objekte behandelt, sodass kein Standardtypkonverter für das Attribut zulässig ist.The array contents are handled as general objects, therefore no default type converter for the attribute is feasible. Außerdem erfordert X: Array-Markuperweiterung einen type-Parameter.Also, x:Array Markup Extension requires a type parameter.

Siehe auchSee also