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

XAML wird in Common Language Runtime (CLR)-Frameworks implementiert und unterstützt die Möglichkeit, eine benutzerdefinierte Klasse oder Struktur in jeder beliebigen Common Language Runtime (CLR)-Sprache zu definieren und dann mithilfe von XAML-Markup auf diese Klasse zuzugreifen.XAML as implemented in common language runtime (CLR) frameworks supports the ability to define a custom class or structure in any 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 in WPFWPF immer in XAML erstellt werden. Dies liegt daran, dass die CLR-Compiler implizit einen Parameter losen Konstruktor für eine Struktur erstellen, die alle Eigenschaftswerte mit ihren Standardwerten initialisiert.Structures that you define as custom types are always able to be constructed in XAML in WPFWPF .This is because the CLR compilers implicitly create a parameterless 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 für eine solche Struktur ist 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 auch ähnliches Verhalten für die Code Erstellung durch einen nicht parameterlosen Konstruktor verfügbar machen.The structure should also expose similar behavior for code construction through a non-parameterless constructor.

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

Eigenschaften müssen auf einen durch einen Werttyp (z. b. ein primitiv) verweisen oder eine Klasse für den Typ verwenden, die entweder einen Parameter losen Konstruktor oder einen dedizierten Typkonverter hat, 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 parameterless constructor or a dedicated type converter that a XAML processor can access. In der CLR-XAML-Implementierung finden XAML-Prozessoren solche Konverter entweder durch systemeigene Unterstützung für sprach Primitive oder durch die Anwendung von TypeConverterAttribute auf einen Typ oder Member in den Sicherungstyp Definitionen.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 das Erstellen des Object-Elements für die-Klasse überhaupt einen öffentlichen Parameter losen Konstruktor für die-Klasse erfordert.This is because creating the object element for the class at all requires a public parameterless 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 Objekt Element Verwendung des Typs. nur das vorhanden sein eines Parameter losen Konstruktors für diesen Typ ermöglicht die Verwendung von Objekt Elementen.A type converter does not enable object element usage of the type; only the presence of a parameterless 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 entspricht im Wesentlichen der Verwendung einer Attribut Syntax, und eine solche Verwendung ist nicht üblich, es sei denn, es ist eine robustere Leerraum Behandlung des Attribut Werts erforderlich.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, bei denen die Attribut Syntax zulässig ist, aber die Eigenschafts Element Syntax, die ein Objekt Element enthält, nicht durch XAML zulässig ist, sind verschiedene Eigenschaften, die den Cursor Typ annehmen.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 dedizierten Typkonverter CursorConverter, macht aber keinen Parameter losen Konstruktor verfügbar, sodass die Cursor-Eigenschaft nur über die Attribut Syntax festgelegt werden kann, obwohl der tatsächliche Cursor Typ ein Verweistyp ist.The Cursor class has a dedicated type converter CursorConverter, but does not expose a parameterless 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. Dadurch wird eine "Mini Sprache" aktiviert, die Objekte des Typs der Eigenschaft inline instanziiert, indem die eingehenden Zeichen folgen Werte des Attributs als Eingabe für einen ConvertFrom Vorgang auf der Grundlage des entsprechenden Typs verarbeitet werden.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 zu verwenden, bei denen Sie vorhandene CLR-Typen verwenden möchten, die keinen Parameter losen Konstruktor oder einen attributierten Typkonverter bereitstellen.However, it is also possible to use type converters for attributes where you want to use existing CLR types that do not supply either a parameterless constructor or an attributed type converter. Beispiele aus der WPFWPF-API sind bestimmte Eigenschaften, die den CultureInfo-Typ annehmen.Examples from the WPFWPF API are certain properties that take the CultureInfo type. In diesem Fall wurde WPFWPF das vorhandene Microsoft .NET Framework CultureInfo Type verwendet, um Kompatibilitäts-und Migrationsszenarien besser zu behandeln, die in früheren Versionen von Frameworks verwendet wurden, aber der CultureInfo Typ unterstützte nicht die erforderlichen Konstruktoren oder Typkonvertierungen auf Typebene, um direkt als XAML-Eigenschafts Wert verwendet werden zu können.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 trifft vor allem dann zu, wenn Sie die vorhandene Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) Implementierung des XAML-Prozessors verwenden, da Sie die Leistung mithilfe DependencyProperty-Unterstützung verbessern können.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

Gelegentlich müssen Sie eine benutzerdefinierte TypeConverter abgeleitete Klasse schreiben, um eine Typkonvertierung für Ihren Eigenschaftentyp bereitzustellen.You occasionally will need to write a custom TypeConverter derived class to provide type conversion for your property type. Anweisungen zum Ableiten von und zum Erstellen eines Typkonverters, der XAML-Verwendungen unterstützen kann, sowie zum Anwenden des TypeConverterAttributefinden 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

Um als CLR-Ereignis verwendet werden zu können, muss das Ereignis als öffentliches Ereignis für eine Klasse verfügbar gemacht werden, die einen Parameter losen Konstruktor unterstützt, oder für eine abstrakte Klasse, bei der auf das Ereignis in abgeleiteten Klassen zugegriffen werden kann.To be usable as a CLR event, the event must be exposed as a public event on a class that supports a parameterless constructor, or on an abstract class where the event can be accessed on derived classes. Um bequem als Routing Ereignis verwendet werden zu können, sollte das CLR-Ereignis explizite add-und remove-Methoden implementieren, die Handler für die CLR-Ereignis Signatur hinzufügen und entfernen und diese Handler an die AddHandler-und RemoveHandler-Methoden weiterleiten.In order to be used conveniently as a routed event, your CLR event should implement explicit add and remove methods, which add and remove handlers for the CLR 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, Handler für Routing Ereignisse mithilfe von AddHandlerdirekt zu registrieren und absichtlich kein CLR-Ereignis zu definieren, das das Routing Ereignis verfügbar macht.It is possible to register handlers directly for routed events using AddHandler, and to deliberately not define a CLR 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 weder Methoden noch Indexer (Ausnahme: XAML 2009 kann Methoden unterstützen, aber die Verwendungen von XAML 2009 schränkt die Verwendungsmöglichkeiten mit WPF ein; siehe 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 generischen List und Dictionary Schnittstellen (IList<T> und IDictionary<TKey,TValue>) werden nicht für die Sammlungs Erkennung durch den WPFWPF XAML-Prozessor unterstützt.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 verwenden, da Sie IList direkt implementiert oder als Basisklasse Dictionary<TKey,TValue>, da Sie IDictionary direkt implementiert.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 von Sammlungs Eigenschaften muss der benutzerdefinierte Auflistungstyp keinen Parameter losen Konstruktor 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 parameterless constructor in order to be used in XAML implicitly. Sie können jedoch optional einen Parameter losen Konstruktor für den Auflistungstyp angeben.However, you can optionally provide a parameterless constructor for the collection type. Dies ist eine durchaus ratsame Praxis.This can be a worthwhile practice. Wenn Sie keinen Parameter losen Konstruktor bereitstellen, können Sie die Auflistung nicht explizit als Objekt Element deklarieren.Unless you do provide a parameterless 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. Außerdem kann ein Parameter loser Konstruktor die Initialisierungs Anforderungen vereinfachen, wenn Sie neue Objekte erstellen, die Ihren Auflistungstyp als Eigenschafts Wert verwenden.Also, a parameterless 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 als XAML-Inhalts Eigenschaft für die Klasse zu deklarieren, wenden Sie die ContentPropertyAttribute als Teil der Klassendefinition an.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 vorgesehenen XAML-Inhalts Eigenschaft als Name im Attribut an.Specify the name of the intended XAML content property as the Name in the attribute. Die-Eigenschaft wird als Zeichenfolge anhand des Namens angegeben, nicht als reflektionskonstrukt, wie 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-Inhalts Eigenschaft, die primitive Werte annehmen kann, z. b. eine String, und einen einzelnen Verweis Objektwert annimmt.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 typische Grund für einen Object Inhaltstyp besteht darin, sowohl eine einfache Möglichkeit zum Hinzufügen von Objekt Inhalten als Zeichenfolge (die eine standardmäßige Präsentations Behandlung empfängt) als auch eine erweiterte Methode zum Hinzufügen von Objekt Inhalten zu unterstützen, die eine nicht standardmäßige Präsentation oder zusätzliche Daten angibt.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