Vererbung von Eigenschaftswerten

Die Vererbung von Eigenschaftswerten ist ein Feature des WPF-Eigenschaftensystems (Windows Presentation Foundation). 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. 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. 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.

Die Vererbung von Eigenschaftswerten ist eine Einschlussvererbung

„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. Diese Bedeutung der Vererbung gilt auch in WPF: Eigenschaften, die in verschiedenen Basisklassen definiert sind, werden als Attribute für abgeleitete XAML-Klassen verfügbar gemacht, wenn sie als Elemente verwendet werden, und sie werden dem Code als Member verfügbar gemacht. 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. Diese Elementstruktur ist unmittelbar sichtbar, wenn Sie bei der Definition von Anwendungen im XAML-Markup Elemente innerhalb anderer Elemente schachteln. 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.

Vererbung von Eigenschaftswerten in der praktischen Anwendung

Die WPF-APIs umfassen mehrere Eigenschaften, für die die Vererbung von Eigenschaftswerten aktiviert ist. 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. Beispielsweise steuert die Eigenschaft FlowDirection die Richtung des Inhaltsflusses und die Darstellung und Anordnung auf der Seite. In der Regel möchten Sie, dass das Textflusskonzept bei allen untergeordneten Elemente einheitlich behandelt werden soll. 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. Wenn Sie die Eigenschaft FlowDirection vererben, muss der Wert nur einmalig auf der Ebene der Elementstruktur festgelegt oder zurückgesetzt werden, die die Präsentationsanforderungen jeder Seite in der Anwendung umfasst. Auf diese Weise wird auch der anfängliche Standardwert erben. 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.

Erstellen einer benutzerdefinierten, vererbbaren Eigenschaft

Ändern Sie die Metadaten einer benutzerdefinierten Eigenschaft, können Sie auch Ihre eigenen benutzerdefinierten Eigenschaften vererbbar machen. Beachten Sie jedoch, dass das Festlegen einer Eigenschaft als vererbbar Überlegungen zur Leistung notwendig macht. 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.

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. Registrieren Sie die Eigenschaft mit Metadaten (FrameworkPropertyMetadata), und geben Sie die Option „Inherits“ in den Optionseinstellungen innerhalb dieser Metadaten an. Stellen Sie außerdem sicher, dass die Eigenschaft einen festgelegten Standardwert hat, da dieser Wert nun erbt. 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. Danach kann die vererbbare Eigenschaft entweder mit dem direkten Eigenschaftenwrapper auf den Besitzertyp oder abgeleitete Typen festgelegt werden oder mit der angefügten Eigenschaftssyntax für ein beliebiges DependencyObject festgelegt werden.

Angefügte Eigenschaften ähneln vom Konzept her den globalen Eigenschaften. Sie können den Wert für ein beliebiges DependencyObject überprüfen und erhalten ein gültiges Ergebnis. Das typische Szenario für angefügte Eigenschaften ist das Festlegen von Eigenschaftswerten für untergeordnete Elemente. Dieses Szenario ist effizienter, wenn die betreffende Eigenschaft eine angefügte Eigenschaft ist, die immer implizit als angefügte Eigenschaft für jedes Element (DependencyObject) in der Struktur vorhanden ist.

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. Verwenden Sie immer RegisterAttached, um Eigenschaften zu registrieren, bei denen Sie Inherits in den Metadaten angeben.

Vererbung von Eigenschaftswerten über Strukturgrenzen hinweg

Vererbung erfolgt durch die Traversierung einer Elementstruktur. Diese Struktur ist häufig parallel zur logischen Struktur. Wenn Sie jedoch ein WPF-Objekt der Kernebene in das Markup einfügen, das eine Elementstruktur definiert (wie etwa Brush), haben Sie eine nicht zusammenhängende logische Struktur erstellt. Eine echte logische Struktur erstreckt sich konzeptionell nicht über Brush, da die logische Struktur ein Konzept auf Ebene des WPF-Frameworks ist. Sie können dies an den Ergebnissen sehen, wenn Sie die Methoden von LogicalTreeHelper verwenden. Die Vererbung von Eigenschaftswerten kann diese Lücke in der logischen Struktur jedoch schließen und vererbte Werte dennoch weitergeben, solange die vererbbare Eigenschaft als angefügte Eigenschaft registriert wurde und keine bewusste Grenze ermittelt wird, die die Vererbung blockiert (z. B. ein Frame).

Weitere Informationen