Vererbung von EigenschaftswertenProperty Value Inheritance

Die Vererbung von Eigenschaftswerten ist eine Funktion des Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)-Eigenschaftssystems.Property value inheritance is a feature of the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) property system. Die Vererbung von Eigenschaftswerten ermöglicht untergeordneten Elementen in einer Elementstruktur, den Wert einer bestimmten Eigenschaft von übergeordneten Elementen zu übernehmen. Dabei erben sie den Wert, der im nächsten übergeordneten Element festgelegt wurde.Property value inheritance enables child elements in a tree of elements to obtain the value of a particular property from parent elements, inheriting that value as it was set anywhere in the nearest parent element. Das übergeordnete Element hat seinen Wert möglicherweise ebenfalls durch die Vererbung von Eigenschaftswerten erhalten, damit das System auf den Seitenstamm zurückgeführt werden kann.The parent element might also have obtained its value through property value inheritance, so the system potentially recurses all the way to the page root. Die Vererbung von Eigenschaftswerten ist nicht das Standardverhalten eines Eigenschaftssystems. Eine Eigenschaft muss mit einer bestimmten Metadateneinstellung eingerichtet werden, damit diese die Vererbung von Eigenschaftswerten für untergeordnete Elemente veranlassen kann.Property value inheritance is not the default property system behavior; a property must be established with a particular metadata setting in order to cause that property to initiate property value inheritance on child elements.

Die Vererbung von Eigenschaftswerten ist eine EinschlussvererbungProperty Value Inheritance Is Containment Inheritance

„Vererbung“ als ein Begriff wie hier, ist nicht ganz dasselbe Konzept wie Vererbung im Typenkontext und der allgemeinen objektorientierten Programmierung, wobei abgeleitete Klassen Memberdefinitionen von ihren Basisklassen erben."Inheritance" as a term here is not quite the same concept as inheritance in the context of types and general object-oriented programming, where derived classes inherit member definitions from their base classes. Diese Bedeutung von Vererbung ist auch aktiv in WPFWPF: Eigenschaften, die in verschiedenen Basisklassen festgelegt sind, werden als Attribute für abgeleitete XAMLXAML-Klassen verfügbar gemacht, wenn sie als Elemente verwendet werden und werden dem Code als Member verfügbar gemacht.That meaning of inheritance is also active in WPFWPF: properties defined in various base classes are exposed as attributes for derived XAMLXAML classes when used as elements, and exposed as members for code. Bei der Vererbung von Eigenschaftswerten geht es insbesondere darum, wie Eigenschaftswerte von einem Element zu einem anderen, auf der Grundlage der über-und untergeordneten Elementen in einer Elementstruktur, erben können.Property value inheritance is particularly about how property values can inherit from one element to another on the basis of the parent-child relationships within a tree of elements. Diese Elementstruktur ist unmittelbar sichtbar, wenn Elemente in andere Elemente geschachtelt werden, wenn Sie Anwendungen in XAMLXAML-Markup festlegen.That tree of elements is most directly visible when nesting elements inside other elements as you define applications in XAMLXAML markup. Objektstrukturen können auch programmgesteuert durch das Hinzufügen von Objekten zu angegebenen Auflistungen von anderen Objekten erstellt werden, und die Vererbung von Eigenschaftswerten funktioniert auf dieselbe Weise zur Laufzeit in der fertigen Struktur.Trees of objects can also be created programmatically by adding objects to designated collections of other objects, and property value inheritance works the same way in the finished tree at run time.

Vererbung von Eigenschaftswerten in der praktischen AnwendungPractical Applications of Property Value Inheritance

Die WPFWPF APIs umfassen mehrere Eigenschaften, für die die Eigenschaften Vererbung aktiviert ist.The WPFWPF APIs include several properties that have property inheritance enabled. In der Regel ist das Szenario dafür, dass sie Eigenschaft einbeziehen, wenn dies angebracht ist, damit die Eigenschaft nur einmal pro Seite festgelegt wird, aber nur wenn diese Eigenschaft auch ein Member einer der Klassenbasiselement und daher auch für die meisten der untergeordneten Elemente vorhanden ist.Typically, the scenario for these is that they involve a property where it is appropriate that the property be set only once per page, but where that property is also a member of one of the base element classes and thus would also exist on most of the child elements. Beispielsweise steuert die FlowDirection -Eigenschaft, welche Richtung Inhalt weitergeleitet und auf der Seite angeordnet werden soll.For example, the FlowDirection property controls which direction flowed content should be presented and arranged on the page. In der Regel möchten Sie, dass das Textflusskonzept bei allen untergeordneten Elemente einheitlich behandelt werden soll.Typically, you want the text flow concept to be handled consistently throughout all child elements. Wenn die Flussrichtung aus irgendeinem Grund in einer Ebene der Elementstruktur durch Benutzer oder Umgebungsaktionen zurückgesetzt wurde, sollten sie in der Regel in der gesamten Elementstruktur zurückgesetzt werden.If flow direction were for some reason reset in some level of the element tree by user or environment action, it should typically be reset throughout. Wenn die FlowDirection Eigenschaft für die Vererbung erstellt wird, muss der Wert nur einmal auf der Ebene in der Elementstruktur festgelegt oder zurückgesetzt werden, die die Präsentationsanforderungen jeder Seite in der Anwendung umfasst.When the FlowDirection property is made to inherit, the value need only be set or reset once at the level in the element tree that encompasses the presentation needs of each page in the application. Auf diese Weise wird auch der anfängliche Standardwert erben.Even the initial default value will inherit in this way. Das Eigenschaftswert-Vererbungsmodell kann weiterhin einzelne Elemente aktivieren, um den Wert in den seltenen Fällen zurückzusetzen, in denen eine Mischung aus Flussrichtungen beabsichtigt ist.The property value inheritance model still enables individual elements to reset the value for the rare cases where having a mix of flow directions is intentional.

Erstellen einer benutzerdefinierten, vererbbaren EigenschaftMaking a Custom Property Inheritable

Ändern Sie die Metadaten einer benutzerdefinierten Eigenschaft, können Sie auch Ihre eigenen benutzerdefinierten Eigenschaften vererbbar machen.By changing a custom property's metadata, you can also make your own custom properties inheritable. Beachten Sie jedoch, dass das Festlegen einer Eigenschaft als vererbbar Überlegungen zur Leistung notwendig macht.Note, however, that designating a property as inheritable does have some performance considerations. In Fällen, in denen diese Eigenschaft keinen festgelegten lokalen Wert oder einen Wert hat, der durch die Stile, Vorlagen oder Datenbindung erreicht wird, stellt eine vererbbare Eigenschaft ihre zugewiesenen Eigenschaftswerte allen untergeordneten Elemente in der logischen Struktur zur Verfügung.In cases where that property does not have an established local value, or a value obtained through styles, templates, or data binding, an inheritable property provides its assigned property values to all child elements in the logical tree.

Erstellen Sie eine benutzerdefinierte, angefügte Eigenschaft wie unter Registrieren einer angefügten Eigenschaft beschrieben, um eine Eigenschaft an der Vererbung von Eigenschaftswerten zu beteiligen.To make a property participate in value inheritance, create a custom attached property, as described in Register an Attached Property. Registrieren Sie die-Eigenschaft mitFrameworkPropertyMetadataMetadaten (), und geben Sie die "erbt"-Option in den Options Einstellungen innerhalb dieser Metadaten an.Register the property with metadata (FrameworkPropertyMetadata) and specify the "Inherits" option in the options settings within that metadata. Stellen Sie außerdem sicher, dass die Eigenschaft einen festgelegten Standardwert hat, da dieser Wert nun erbt.Also make sure that the property has an established default value, because that value will now inherit. Obwohl Sie die Eigenschaft als angehängt registriert haben, empfiehlt es sich auch eine Eigenschaft „Wrapper“ für den Get/Set-Zugriff auf den Besitzertyp zu erstellen, genauso wie Sie es bei einer „nicht angefügten“ Abhängigkeitseigenschaft machen würden.Although you registered the property as attached, you might also want to create a property "wrapper" for get/set access on the owner type, just as you would for an "nonattached" dependency property. Danach kann die vererbbare Eigenschaft entweder mit dem direkten Eigenschaften Wrapper für den Besitzertyp oder die abgeleiteten Typen festgelegt werden, oder Sie kann mithilfe der Syntax der angefügten Eigenschaft für beliebige DependencyObjectfestgelegt werden.After doing so, the inheritable property can either be set by using the direct property wrapper on the owner type or derived types, or it can be set by using the attached property syntax on any DependencyObject.

Angefügte Eigenschaften sind konzeptionell vergleichbar mit globalen Eigenschaften. Sie können auf einen beliebigen DependencyObject Wert überprüfen und ein gültiges Ergebnis erhalten.Attached properties are conceptually similar to global properties; you can check for the value on any DependencyObject and get a valid result. Das typische Szenario für angefügte Eigenschaften besteht darin, Eigenschaftswerte für untergeordnete Elemente festzulegen, und dieses Szenario ist effektiver, wenn die betreffende Eigenschaft eine angefügte Eigenschaft ist, die für jedes Element immer implizit als angefügte Eigenschaft vorhanden ist (DependencyObject) in der-Struktur.The typical scenario for attached properties is to set property values on child elements, and that scenario is more effective if the property in question is an attached property that is always implicitly present as an attached property on each element (DependencyObject) in the tree.

Hinweis

Obwohl die Vererbung von Eigenschaftswerten bei nicht angefügten Abhängigkeitseigenschaften zu funktionieren scheint, ist das Vererbungsverhalten einer nicht angefügten Eigenschaft über bestimmte Elementgrenzen in der Laufzeitstruktur nicht festgelegt.Although property value inheritance might appear to work for nonattached dependency properties, the inheritance behavior for a nonattached property through certain element boundaries in the run-time tree is undefined. Verwenden RegisterAttached Sie immer, um die Eigenschaften zu Inherits registrieren, die Sie in den Metadaten angeben.Always use RegisterAttached to register properties where you specify Inherits in the metadata.

Vererbung von Eigenschaftswerten über Strukturgrenzen hinwegInheriting Property Values Across Tree Boundaries

Vererbung erfolgt durch die Traversierung einer Elementstruktur.Property inheritance works by traversing a tree of elements. Diese Struktur ist häufig parallel zur logischen Struktur.This tree is often parallel to the logical tree. Wenn Sie jedoch ein WPF-Objekt auf der Kernebene in das Markup einschließen, das eine Elementstruktur definiert, z Brush. b. eine, haben Sie eine nicht kontinuierliche logische Struktur erstellt.However, whenever you include a WPF core-level object in the markup that defines an element tree, such as a Brush, you have created a discontinuous logical tree. Eine echte logische Struktur wird nicht konzeptionell durch Brusherweitert, da die logische Struktur ein WPF-Framework auf Frameworkebene ist.A true logical tree does not conceptually extend through the Brush, because the logical tree is a WPF framework-level concept. Dies wird in den Ergebnissen angezeigt, wenn Sie die Methoden von LogicalTreeHelperverwenden.You can see this reflected in the results when using the methods of LogicalTreeHelper. Allerdings kann die Vererbung von Eigenschafts Werten diese Lücke in der logischen Struktur überbrücken und geerbte Werte weiterhin über übergeben, solange die vererbbare Eigenschaft als angefügte Eigenschaft registriert wurde und keine absichtliche Vererbungs Grenze (z. b. eine Frame) gefunden wird.However, property value inheritance can bridge this gap in the logical tree and can still pass inherited values through, so long as the inheritable property was registered as an attached property and no deliberate inheritance-blocking boundary (such as a Frame) is encountered.

Siehe auchSee also