XAML- und benutzerdefinierte Klassen für WPFXAML and Custom Classes for WPF

Die Implementierung von XAML in Common Language Runtime (CLR)common language runtime (CLR)-Frameworks unterstützt die Möglichkeit zum Definieren einer benutzerdefinierten Klasse oder Struktur in einer beliebigen Common Language Runtime (CLR)common language runtime (CLR)-Sprache und den anschließenden Zugriff auf diese Klasse unter Verwendung von XAML-Markup.XAML as implemented in Common Language Runtime (CLR)common language runtime (CLR) frameworks supports the ability to define a custom class or structure in any Common Language Runtime (CLR)common language runtime (CLR) language, and then access that class using XAML markup. Sie können eine Mischung aus Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)-Typen und ihren benutzerdefinierten Typen innerhalb derselben Markupdatei verwenden. Die übliche Vorgehensweise hierbei ist, Ihren benutzerdefinierten Typen ein XAML-Namespace-Präfix zuzuordnen.You can use a mixture of Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)-defined types and your custom types within the same markup file, typically by mapping the custom types to a XAML namespace prefix. Dieses Thema beschreibt die Anforderungen, die eine benutzerdefinierte Klasse erfüllen muss, um als XAML-Element verwendet werden zu können.This topic discusses the requirements that a custom class must satisfy to be usable as a XAML element.

Benutzerdefinierte Klassen in Anwendungen oder AssemblysCustom Classes in Applications or Assemblies

Benutzerdefinierte Klassen, die in XAML verwendet werden, können auf zwei verschiedene Arten definiert werden: im CodeBehind oder in anderem Code, der die primäre Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)-Anwendung erzeugt, oder als Klasse in einer separaten Assembly, z.B. einer ausführbare Datei oder einer als Klassenbibliothek verwendeten DLL.Custom classes that are used in XAML can be defined in two distinct ways: within the code-behind or other code that produces the primary Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) application, or as a class in a separate assembly, such as an executable or DLL used as a class library. Jeder dieser Ansätze hat bestimmte Vor- und Nachteile.Each of these approaches has particular advantages and disadvantages.

  • Der Vorteil der Erstellung einer Klassenbibliothek ist, dass alle diese benutzerdefinierten Klassen über viele verschiedene mögliche Anwendungen gemeinsam genutzt werden können.The advantage of creating a class library is that any such custom classes can be shared across many different possible applications. Eine separate Bibliothek gibt Ihnen auch mehr Kontrolle über die Versionierung von Anwendungen und vereinfacht das Erstellen einer Klasse, in denen die gewünschten Klasse als Stammelement auf einer XAML-Seite verwendet wird.A separate library also makes versioning issues of applications easier to control, and simplifies creating a class where the intended class usage is as a root element on a XAML page.

  • Der Vorteil bei der Definition der benutzerdefinierten Klassen in der Anwendung ist, dass diese Technik relativ schlank ist und Probleme bei Bereitstellung und Tests minimiert, die auftreten, wenn Sie separate Assemblys zusätzlich zur ausführbaren Hauptdatei der Anwendung einführen.The advantage of defining the custom classes in the application is that this technique is relatively lightweight and minimizes the deployment and testing issues encountered when you introduce separate assemblies beyond the main application executable.

  • Egal, ob sie in derselben oder einer anderen Assembly definiert sind: benutzerdefinierte Klassen benötigen eine Zuordnung zwischen dem CLR-Namespace und dem XML-Namespace, um in XAML als Elemente verwendet werden zu können.Whether defined in the same or different assembly, custom classes need to be mapped between CLR namespace and XML namespace in order to be used in XAML as elements. Siehe XAML-Namespaces und Namespacezuordnung für WPF-XAML.See XAML Namespaces and Namespace Mapping for WPF XAML.

Anforderungen an benutzerdefinierten Klassen als XAML-ElementeRequirements for a Custom Class as a XAML Element

Um als Objektelement instanziiert werden zu können, muss die Klasse die folgenden Anforderungen erfüllen:In order to be able to be instantiated as an object element, your class must meet the following requirements:

  • Ihre benutzerdefinierte Klasse muss öffentlich sein und über einen parameterlosen öffentlichen Standardkonstruktor verfügen.Your custom class must be public and support a default (parameterless) public constructor. (Hinweise zu Strukturen finden Sie im folgenden Abschnitt.)(See following section for notes regarding structures.)

  • Die benutzerdefinierte Klasse darf keine geschachtelte Klasse sein.Your custom class must not be a nested class. Geschachtelte Klassen und der "Punkt" in ihrer allgemeinen CLR-Notation verursachen Konflikte mit anderen WPFWPF- und/oder XAML-Funktionen wie z.B. angefügten Eigenschaften.Nested classes and the "dot" in their general CLR usage syntax interfere with other WPFWPF and/or XAML features such as attached properties.

Ihre Objektdefinition ermöglicht nicht nur die Verwendung von Objektelement-Syntax, sondern auch von Eigenschaftenelement-Syntax für alle öffentlichen Eigenschaften, die dieses Objekt als Werttyp haben.In addition to enabling object element syntax, your object definition also enables property element syntax for any other public properties that take that object as the value type. Dies liegt darin begründet, dass das Objekt jetzt als Objektelement instanziiert werden kann und somit den Eigenschaftenelementwert einer solchen Eigenschaft befüllen kann.This is because the object can now be instantiated as an object element and can fill the property element value of such a property.

StrukturenStructures

Strukturen, die Sie als benutzerdefinierte Typen definieren, können immer in XAML in WPFWPF erstellt werden. Grund hierfür ist, dass die CLRCLR-Compiler implizit einen Standardkonstruktor für Strukturen erstellen, die alle Eigenschaftswerte mit ihren Standardwerten initialisieren.Structures that you define as custom types are always able to be constructed in XAML in WPFWPF .This is because the CLRCLR compilers implicitly create a default constructor for a structure that initializes all property values to their defaults. In einigen Fällen sind für Strukturen das standardmäßige Konstruktionsverhalten und/oder die Verwendung als Objektelement nicht ratsam.In some cases, the default construction behavior and/or object element usage for a structure is not desirable. Möglicherweise sollen die Struktur und ihre befüllten Werte konzeptionell als Einheit fungieren, wobei die enthaltenen Werte möglicherweise sich gegenseitig ausschließende Interpretationen haben und daher keiner ihrer Eigenschaften ein Wert zugewiesen werden kann.This might be because the structure is intended to fill values and function conceptually as a union, where the values contained might have mutually exclusive interpretations and thus none of its properties are settable. Ein WPFWPF Beispiel einer solchen Struktur wird GridLength.A WPFWPF example of such a structure is GridLength. Im Allgemeinen sollten solche Strukturen einen Typkonverter implementieren, sodass die Werte in Attributform ausgedrückt werden können, mit String-Konventionen, welche die verschiedenen Interpretationen oder Modi der Strukturwerte erstellen.Generally, such structures should implement a type converter such that the values can be expressed in attribute form, using string conventions that create the different interpretations or modes of the structure's values. Die Struktur sollte über einen nicht standardmäßigen Konstruktor ein ähnliches Verhalten auch für die Codekonstruktion verfügbar machen.The structure should also expose similar behavior for code construction through a non-default constructor.

Anforderungen an Eigenschaften einer benutzerdefinierten Klasse als XAML-AttributeRequirements for Properties of a Custom Class as XAML Attributes

Eigenschaften müssen einen Werttypen referenzieren (z.B. einen primitiven Typen) oder eine Klasse verwenden, die entweder einen Standardkonstruktor oder einen Typkonverter besitzt, auf den ein XAML-Prozessor zugreifen kann.Properties must reference a by-value type (such as a primitive), or use a class for type that has either a default constructor or a dedicated type converter that a XAML processor can access. In der CLR XAML-Implementierung finden XAML-Prozessoren entweder diese Konverter durch native Unterstützung für Sprachprimitive, oder durch Anwenden von TypeConverterAttribute auf einen Typ oder Member in unterstützenden Typdefinitionen.In the CLR XAML implementation, XAML processors either find such converters through native support for language primitives, or through application of TypeConverterAttribute to a type or member in backing type definitions

Alternativ kann die Eigenschaft auf einen abstrakten Klassentyp oder eine Schnittstelle verweisen.Alternatively, the property may reference an abstract class type, or an interface. Bei abstrakten Klassen oder Schnittstellen wird bei der XAML-Analyse erwartet, dass der Eigenschaftswert mit praktischen Klasseninstanzen befüllt sein muss, die die Schnittstelle implementieren, oder Instanzen von Typen, die von der abstrakten Klasse abgeleitet sind.For abstract classes or interfaces, the expectation for XAML parsing is that the property value must be filled with practical class instances that implement the interface, or instances of types that derive from the abstract class.

Eigenschaften können für eine abstrakte Klasse deklariert werden, können jedoch nur in praktischen Klassen festgelegt werden, die von der abstrakten Klasse abgeleitet sind.Properties can be declared on an abstract class, but can only be set on practical classes that derive from the abstract class. Dies liegt daran, dass für das Erstellen eines Objektelements dieser Klasse ein öffentlicher Standardkonstruktor für diese Klasse Grundvoraussetzung ist.This is because creating the object element for the class at all requires a public default constructor on the class.

TypeConverter-fähige AttributsyntaxTypeConverter Enabled Attribute Syntax

Wenn Sie einen dedizierten, mit Attributen versehenen Typkonverter auf Klassenebene bereitstellen, wird durch die angewendete Typumwandlung Attributsyntax für jede Eigenschaft ermöglicht, die diesen Typ instanziieren muss.If you provide a dedicated, attributed type converter at the class level, the applied type conversion enables attribute syntax for any property that needs to instantiate that type. Ein Typkonverter ermöglicht keine Objektelementverwendung des Typs; nur das Vorhandensein eines Standardkonstruktors für diesen Typ ermöglicht Objektelementverwendung.A type converter does not enable object element usage of the type; only the presence of a default constructor for that type enables object element usage. Aus diesem Grund sind Eigenschaften, für die ein Typkonverter aktiviert ist, im Allgemeinen nicht in Eigenschaftensyntax verwendbar, es sei denn, der Typ selbst unterstützt ebenfalls Objektelementsyntax.Therefore, properties that are type-converter enabled are generally speaking not usable in property syntax, unless the type itself also supports object element syntax. Die Ausnahme ist, wenn Sie eine Eigenschaftenelement-Syntax angeben, das Eigenschaftenelement jedoch eine Zeichenfolge enthält.The exception to this is that you can specify a property element syntax, but have the property element contain a string. Diese Verwendung ist Wesentlichen äquivalent zur Nutzung der Attributsyntax, und eine solche Verwendung ist nicht üblich, es sei denn, besteht die Notwendigkeit für eine robustere Behandlung von Leerzeichen von den Wert des Attributs.That usage is really essentially equivalent to an attribute syntax usage, and such a usage is not common unless there is a need for more robust white-space handling of the attribute value. Nachfolgend sehen sie z.B. ein Eigenschaftenelement, das eine Zeichenfolge akzeptiert, und das dazugehörige Äquivalent in Attributsyntax:For example, the following is a property element usage that takes a string, and the attribute usage equivalent:

<Button>Hallo!
  <Button.Language>
    de-DE
  </Button.Language>
</Button>
<Button Language="de-DE">Hallo!</Button>

Beispiele für Eigenschaften, die Attributsyntax zulässig ist jedoch Eigenschaftenelement-Syntax, die ein Objektelement enthält ist nicht zulässig, über die XAML, sind verschiedene Eigenschaften, verwenden die Cursor Typ.Examples of properties where attribute syntax is allowed but property element syntax that contains an object element is disallowed through XAML are various properties that take the Cursor type. Die Cursor -Klasse verfügt über einen Typkonverter CursorConverter, aber nicht über einen Standardkonstruktor verfügbar macht also die Cursor Eigenschaft kann nur festgelegt werden über die Attributsyntax, obwohl die tatsächliche Cursor Typ ein Verweistyp ist.The Cursor class has a dedicated type converter CursorConverter, but does not expose a default constructor, so the Cursor property can only be set through attribute syntax even though the actual Cursor type is a reference type.

Typkonverter auf EigenschaftenebenePer-Property Type Converters

Alternativ kann die Eigenschaft selbst auf der Eigenschaftenebene einen Typkonverter deklarieren.Alternatively, the property itself may declare a type converter at the property level. Dies ermöglicht eine "Minisprache", die Objekte vom Typ der Eigenschaft Inline instanziiert, indem eingehende Zeichenfolgenwerte des Attributs als Eingabe für eine ConvertFrom Vorgang basierend auf den entsprechenden Typ.This enables a "mini language" that instantiates objects of the type of the property inline, by processing incoming string values of the attribute as input for a ConvertFrom operation based on the appropriate type. Dies erfolgt in der Regel, um einen zweckmäßigen Accessor bereitzustellen und nicht als alleiniges Mittel zum Festlegen einer Eigenschaft in XAML.Typically this is done to provide a convenience accessor, and not as the sole means to enable setting a property in XAML. Es ist jedoch auch möglich, Typkonverter für Attribute dort einzusetzen, wo Sie vorhandene CLRCLR-Typen verwenden möchten, die entweder keinen Standardkonstruktor oder keinen attribuierten Typkonverter bereitstellen.However, it is also possible to use type converters for attributes where you want to use existing CLRCLR types that do not supply either a default constructor or an attributed type converter. Beispiele aus der WPFWPF -API sind bestimmte Eigenschaften mit den CultureInfo Typ.Examples from the WPFWPF API are certain properties that take the CultureInfo type. In diesem Fall WPFWPF verwendet das bestehende Microsoft .NET Framework CultureInfo Typ für eine bessere Kompatibilität und Migration von Szenarien, die in früheren Versionen des Frameworks verwendet wurden, aber die CultureInfo Typ nicht die erforderlichen Konstruktoren oder auf Typebene typkonvertierung als Eigenschaftswert XAML direkt verwendet werden kann.In this case, WPFWPF used the existing Microsoft .NET Framework CultureInfo type to better address compatibility and migration scenarios that were used in earlier versions of frameworks, but the CultureInfo type did not support the necessary constructors or type-level type conversion to be usable as a XAML property value directly.

Wenn Sie eine Eigenschaft verfügbar machen, die in XAML Verwendung findet, insbesondere dann, wenn Sie Autor eines Steuerelements sind, sollten Sie unbedingt die Eigenschaft durch eine Abhängigkeitseigenschaft unterstützen.Whenever you expose a property that has a XAML usage, particularly if you are a control author, you should strongly consider backing that property with a dependency property. Dies ist vor allem dann, wenn die vorhandene Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) Implementierung der XAML-Prozessor, da Sie mithilfe von verbessern können DependencyProperty sichern.This is particularly true if you use the existing Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) implementation of the XAML processor, because you can improve performance by using DependencyProperty backing. Eine Abhängigkeitseigenschaft wird für Ihre Eigenschaft Funktionen des Eigenschaftensystems verfügbar machen, die Benutzer von einer XAML-zugänglichen Eigenschaft erwarten.A dependency property will expose property system features for your property that users will come to expect for a XAML accessible property. Zu diesen Funktionen gehören z.B. Animationen, Datenbindungen und die Unterstützung von Stilen.This includes features such as animation, data binding, and style support. Weitere Informationen finden Sie unter Benutzerdefinierte Abhängigkeitseigenschaften und Laden von XAML und Abhängigkeitseigenschaften.For more information, see Custom Dependency Properties and XAML Loading and Dependency Properties.

Schreiben und Attribuieren eines TypkonvertersWriting and Attributing a Type Converter

Sie gelegentlich benötigen zum Schreiben einer benutzerdefinierten TypeConverter abgeleitete Klasse, um die typkonvertierung für Ihren Eigenschaftstyp bereitzustellen.You occasionally will need to write a custom TypeConverter derived class to provide type conversion for your property type. Anweisungen zum Ableiten und erstellen einen Typkonverter, die XAML-Verwendungen unterstützen kann, und Anwenden der TypeConverterAttribute, finden Sie unter TypeConverter und XAML.For instructions on how to derive from and create a type converter that can support XAML usages, and how to apply the TypeConverterAttribute, see TypeConverters and XAML.

Anforderungen an die Attributsyntax für XAML-Ereignishandler bei Ereignissen einer Benutzerdefinierten KlasseRequirements for XAML Event Handler Attribute Syntax on Events of a Custom Class

Damit ein Ereignis als CLRCLR-Ereignis verwendet werden kann, muss es als öffentliches Ereignis einer Klasse verfügbar gemacht werden, die einen Standardkonstruktor unterstützt, oder einer abstrakten Klasse, in der auf das Ereignis über abgeleitete Klassen zugegriffen werden kann.To be usable as a CLRCLR event, the event must be exposed as a public event on a class that supports a default constructor, or on an abstract class where the event can be accessed on derived classes. Um einfache Art als Routingereignis, verwendet werden Ihre CLRCLR Ereignis sollten explizit implementieren add und remove -Methoden, die hinzufügen und Entfernen von Ereignishandlern für die CLRCLR Ereignissignatur und dann diese Handler an das AddHandlerund RemoveHandler Methoden.In order to be used conveniently as a routed event, your CLRCLR event should implement explicit add and remove methods, which add and remove handlers for the CLRCLR event signature and forward those handlers to the AddHandler and RemoveHandler methods. Diese Methoden fügen die Handler zum Routingereignis-Handlerspeicher auf der Instanz, der das Ereignis zugeordnet ist, hinzu oder entfernen sie.These methods add or remove the handlers to the routed event handler store on the instance that the event is attached to.

Hinweis

Es ist möglich, registrieren Sie Handler für Routingereignisse mithilfe direkt AddHandler, und absichtlich kein definieren eine CLRCLR -Ereignis, das das Routingereignis verfügbar macht.It is possible to register handlers directly for routed events using AddHandler, and to deliberately not define a CLRCLR event that exposes the routed event. Davon wird im Allgemeinen abgeraten, da das Ereignis in diesem Fall keine XAML-Attributsyntax zum Anhängen von Handlern ermöglicht, und die resultierende Klasse eine weniger transparente XAML-Ansicht der Möglichkeiten dieses Typs bieten wird.This is not generally recommended because the event will not enable XAML attribute syntax for attaching handlers, and your resulting class will offer a less transparent XAML view of that type's capabilities.

Schreiben von AuflistungseigenschaftenWriting Collection Properties

Eigenschaften, die einen Auflistungstyp annehmen, haben eine XAML-Syntax, die Ihnen ermöglicht, Objekte anzugeben, die der Auflistung hinzugefügt werden.Properties that take a collection type have a XAML syntax that enables you to specify objects that are added to the collection. Diese Syntax hat zwei interessante Features.This syntax has two notable features.

  • Das Objekt, das das Auflistungsobjekt darstellt, muss nicht in Objektelementsyntax angegeben werden.The object that is the collection object does not need to be specified in object element syntax. Dieses Auflistungstyps ist implizit dann vorhanden, wenn Sie eine Eigenschaft in XAML angeben, die einen Auflistungstyp annimmt.The presence of that collection type is implicit whenever you specify a property in XAML that takes a collection type.

  • Untergeordnete Elemente der Auflistungseigenschaft im Markup werden so verarbeitet, dass sie Mitglieder der Auflistung werden.Child elements of the collection property in markup are processed to become members of the collection. Normalerweise erfolgt der Codezugriff auf die Mitglieder einer Auflistung über Listen- bzw. Wörterbuch-Methoden wie z.B. Add, oder über einen Indexer.Ordinarily, the code access to the members of a collection is performed through list/dictionary methods such as Add, or through an indexer. XAML-Syntax unterstützt jedoch keine Methoden noch Indexer (Ausnahme: XAML 2009 kann Methoden unterstützen, jedoch mit XAML 2009 schränkt die möglichen Verwendungen von WPF. finden Sie unter XAML 2009-Sprachfunktionen).But XAML syntax does not support methods or indexers (exception: XAML 2009 can support methods, but using XAML 2009 restricts the possible WPF usages; see XAML 2009 Language Features). Auflistungen sind offensichtlich eine durchaus übliche Anforderung beim Erstellen einer Struktur von Elementen, und Sie benötigen eine Methode zum Befüllen dieser Auflistungen im deklarativen XAML-Code.Collections are obviously a very common requirement for building a tree of elements, and you need some way to populate these collections in declarative XAML. Aus diesem Grund werden untergeordnete Elemente einer Auflistungseigenschaft verarbeitet, indem sie der Auflistung hinzugefügt werden, die dem Typwert der Auflistungseigenschaft entspricht.Therefore, child elements of a collection property are processed by adding them to the collection that is the collection property type value.

Die Implementierung von .NET Framework-XAML-Diensten und somit der WPF XAML-Prozessor verwenden die folgende Definition für eine Auflistungseigenschaft.The .NET Framework XAML Services implementation and thus the WPF XAML processor uses the following definition for what constitutes a collection property. Die Eigenschaftentyp der Eigenschaft muss einen der folgenden implementieren:The property type of the property must implement one of the following:

Jeder dieser Typen in CLR verfügt über eine Add-Methode, die vom XAML-Prozessor verwendet wird, um der zugrunde liegenden Auflistung bei der Erstellung des Objektdiagramms Elemente hinzuzufügen.Each of these types in CLR has an Add method, which is used by the XAML processor to add items to the underlying collection when creating the object graph.

Hinweis

Die generische List und Dictionary Schnittstellen (IList<T> und IDictionary<TKey,TValue>) werden nicht unterstützt, für die auflistungserkennung durch den WPFWPF XAML-Prozessor.The generic List and Dictionary interfaces (IList<T> and IDictionary<TKey,TValue>) are not supported for collection detection by the WPFWPF XAML processor. Allerdings können Sie die List<T> Klasse als Basisklasse verwendet, da er implementiert IList direkt oder Dictionary<TKey,TValue> als Basisklasse, da er implementiert IDictionary direkt.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.

Wenn Sie eine Eigenschaft, die eine Auflistung annimmt, deklarieren, sollten Sie sorgfältig darauf achten, wie dieser Eigenschaftswert in neuen Instanzen des Typs initialisiert wird.When you declare a property that takes a collection, be cautious about how that property value is initialized in new instances of the type. Wenn Sie die Eigenschaft nicht als Abhängigkeitseigenschaft implementieren, ist es angebracht, der Eigenschaft ein unterstützendes Feld zuzuweisen, das den Typkonstruktor der Auflistung aufruft.If you are not implementing the property as a dependency property, then having the property use a backing field that calls the collection type constructor is adequate. Wenn die Eigenschaft eine Abhängigkeitseigenschaft ist, müssen Sie die Auflistungseigenschaft als Teil des standardmäßigen Typkonstruktors initialisieren.If your property is a dependency property, then you may need to initialize the collection property as part of the default type constructor. Der Grund dafür ist, dass eine Abhängigkeitseigenschaft ihren Standardwert aus Metadaten übernimmt, und Sie in der Regel nicht möchten, dass der Anfangswert einer Auflistungseigenschaft eine statische, gemeinsam genutzte Auflistung ist.This is because a dependency property takes its default value from metadata, and you typically do not want the initial value of a collection property to be a static, shared collection. Es sollte eine Auflistungsinstanz pro enthaltender Typinstanz geben.There should be a collection instance per each containing type instance. Weitere Informationen finden Sie unter Benutzerdefinierte Abhängigkeitseigenschaften.For more information, see Custom Dependency Properties.

Sie können für Ihre Auflistungseigenschaft einen benutzerdefinierten Auflistungstyp implementieren.You can implement a custom collection type for your collection property. Aufgrund der impliziten Behandlung der Auflistungseigenschaft muss der benutzerdefinierte Auflistungstyp keinen Standardkonstruktor bereitstellen, um implizit in XAML verwendet werden zu können.Because of implicit collection property treatment, the custom collection type does not need to provide a default constructor in order to be used in XAML implicitly. Allerdings können Sie für den Auflistungstyp optional einen Standardkonstruktor bereitstellen.However, you can optionally provide a default constructor for the collection type. Dies ist eine durchaus ratsame Praxis.This can be a worthwhile practice. Solange Sie keinen Standardkonstruktor bereitstellen, können Sie die Auflistung nicht explizit als Element deklarieren.Unless you do provide a default constructor, you cannot explicitly declare the collection as an object element. Einige Markupautoren sehen die explizite Auflistung möglicherweise als guten und zu bevorzugenden Markupstil.Some markup authors might prefer to see the explicit collection as a matter of markup style. Darüber hinaus kann ein Standardkonstruktor die Initialisierungsanforderungen vereinfachen, wenn Sie neue Objekte erstellen, die Ihren Auflistungstyp als Eigenschaftswert verwenden.Also, a default constructor can simplify the initialization requirements when you create new objects that use your collection type as a property value.

Deklarieren von XAML-InhaltseigenschaftenDeclaring XAML Content Properties

Die XAML-Sprache definiert das Konzept einer XAMLXAML-Inhaltseigenschaft.The XAML language defines the concept of a XAMLXAML content property. Jede Klasse, die in Objektsyntax verwendet werden kann, hat genau eine XAML-Inhaltseigenschaft.Each class that is usable in object syntax can have exactly one XAML content property. Um eine Eigenschaft, die XAML-Inhaltseigenschaft für die Klasse zu deklarieren, wenden die ContentPropertyAttribute als Teil der Definition der Klasse.To declare a property to be the XAML content property for your class, apply the ContentPropertyAttribute as part of the class definition. Geben Sie den Namen der gewünschten XAML Inhaltseigenschaft als die Name im Attribut.Specify the name of the intended XAML content property as the Name in the attribute. Die Eigenschaft angegeben wird als Zeichenfolge den Namen nicht als Konstrukt Reflektion z. B. PropertyInfo.The property is specified as a string by name, not as a reflection construct such as PropertyInfo.

Sie können eine Auflistungseigenschaft als XAML-Inhaltseigenschaft angeben.You can specify a collection property to be the XAML content property. Dies führt zu einer Verwendung dieser Eigenschaft, bei der das Objektelement ein oder mehrere untergeordnete Elemente ohne dazwischenliegende Auflistungs-Objektelemente oder Eigenschaftenelement-Tags haben kann.This results in a usage for that property whereby the object element can have one or more child elements, without any intervening collection object elements or property element tags. Diese Elemente werden dann als Wert für die XAML-Inhaltseigenschaft behandelt und der unterstützenden Auflistungsinstanz hinzugefügt.These elements are then treated as the value for the XAML content property and added to the backing collection instance.

Einige vorhandene XAML-Inhaltseigenschaften verwenden den Eigenschaftentyp Object.Some existing XAML content properties use the property type of Object. Dies ermöglicht eine XAML-Inhalt, die primitive können Eigenschaftswerte wie z. B. eine String sowie einen einzelnen Verweisobjektwert.This enables a XAML content property that can take primitive values such as a String as well as taking a single reference object value. Befolgen Sie dieses Modell, ist Ihr Typ sowohl für die Typbestimmung als auch für die Behandlung der möglichen Typen zuständig.If you follow this model, your type is responsible for type determination as well as the handling of possible types. Der Hauptgrund für eine Object Content Typ ist zur Unterstützung von sowohl eine einfache Möglichkeit des Hinzufügens von Objektinhalten als Zeichenfolge (die eine standardmäßige WPF-Behandlung erhält) oder eine fortgeschrittene Möglichkeit zum Hinzufügen von Objekt-Inhalt, der angibt, eine nicht standardmäßige Präsentation oder zusätzliche Daten.The typical reason for an Object content type is to support both a simple means of adding object content as a string (which receives a default presentation treatment), or an advanced means of adding object content that specifies a non-default presentation or additional data.

Serialisieren von XAMLSerializing XAML

Für bestimmte Szenarios, z.B. Wenn Sie Autor eines Steuerelements sind, möchten Sie möglicherweise auch sicherstellen, dass jede Objektdarstellung, die in XAML instanziiert werden kann, auch wieder zurück in das entsprechende XAML-Markup serialisiert werden kann.For certain scenarios, such as if you are a control author, you may also want to assure that any object representation that can be instantiated in XAML can also be serialized back to equivalent XAML markup. Serialisierungsanforderungen werden in diesem Thema nicht beschrieben.Serialization requirements are not described in this topic. Informationen hierzu finden Sie unter Übersicht über das Erstellen von Steuerelementen und Elementstruktur und Serialisierung.See Control Authoring Overview and Element Tree and Serialization.

Siehe auchSee also