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, die Vererbung von Eigenschaftswerten aktiviert haben.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. Z. B. die FlowDirection Eigenschaft steuert, welche Richtung Inhalt fließender, auf der Seite angeordnet und angezeigt 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 erfolgt, um zu erben, der Wert muss nur festgelegt oder einmal zurückgesetzt werden, auf der Ebene in der Elementstruktur, die den darstellungsanforderungen Rand 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 mit Metadaten (FrameworkPropertyMetadata), und geben Sie die Option "Vererbt" in den Optionen dieser Metadaten.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. Nach auf diese Weise kann die vererbbare Eigenschaft entweder mithilfe des direkten eigenschaftswrappers auf dem Besitzertyp oder abgeleiteten Typen festgelegt werden, oder es kann festgelegt werden, mithilfe der angefügten Eigenschaftssyntax für jedes beliebige DependencyObject.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 identisch mit globalen Eigenschaften. sehen Sie sich für den Wert für jedes beliebige DependencyObject und ein gültiges Ergebnis zu 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 ist, um Eigenschaftswerte für untergeordnete Elemente festzulegen, und dieses Szenario ist effizienter, wenn die betreffende Eigenschaft eine angefügte Eigenschaft ist, der immer implizit als angefügte Eigenschaft für jedes Element 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 Sie immer RegisterAttached zum Registrieren von Eigenschaften in dem Sie angeben Inherits in den Metadaten.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. Jedes Mal, wenn Sie jedoch einschließen ein WPF-Kernebenen-Objekts im Markup, das eine Elementstruktur z. B. definiert eine Brush, Sie haben eine nicht aufeinanderfolgende 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 ist konzeptionell nicht über die Brush, da die logische Struktur ein Konzept der WPF-Frameworkebene ist.A true logical tree does not conceptually extend through the Brush, because the logical tree is a WPF framework-level concept. Sehen Sie dies in den Ergebnissen berücksichtigt werden, wenn das mithilfe der Methoden der LogicalTreeHelper.You can see this reflected in the results when using the methods of LogicalTreeHelper. Allerdings die Vererbung von Eigenschaftswerten kann diese Lücke in der logischen Struktur und vererbte Werte, können weiterhin übergeben werden, solange die vererbbare Eigenschaft als angefügte Eigenschaft und keine absichtliche Vererbung blockierende Grenze registriert wurde (z. B. eine Frame) festgestellt 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