Vererbung von Eigenschaftenwerten
Aktualisiert: November 2007
Das Vererben von Eigenschaftenwerten ist ein Feature des Windows Presentation Foundation (WPF)-Eigenschaftensystems. Die Vererbung von Eigenschaftenwerten ermöglicht untergeordneten Elementen in einer Elementstruktur, den Wert einer bestimmten Eigenschaft von übergeordneten Elementen so zu übernehmen, wie er im nächsten übergeordneten Element festgelegt wurde. Das übergeordnete Element hat seinen Wert möglicherweise ebenfalls über die Vererbung des Eigenschaftenwerts erhalten, sodass das System bis auf den Seitenstamm zurückgeführt werden kann. Die Vererbung von Eigenschaftenwerten stellt nicht das standardmäßige Verhalten des Eigenschaftensystems dar; eine Eigenschaft muss mit einer bestimmten Metadateneinstellung erstellt worden sein, damit dieses Element die Vererbung von Eigenschaftenwerten für untergeordnete Elemente veranlassen kann.
Dieses Thema enthält folgende Abschnitte.
- Vererbung von Eigenschaftenwerten ist Kapselungsvererbung
- Vererbung von Eigenschaftenwerten in der Praxis
- Aktivieren der Vererbung einer benutzerdefinierten Eigenschaft
- Vererben von Eigenschaftenwerten über Strukturgrenzen hinweg
- Verwandte Abschnitte
Vererbung von Eigenschaftenwerten ist Kapselungsvererbung
Der Begriff "Vererbung" in diesem Zusammenhang ist nicht identisch mit dem Konzept der Vererbung im Zusammenhang mit Typen und der allgemeinen objektorientierten Programmierung, bei der abgeleitete Klassen Memberdefinitionen von ihren Basisklassen erben. Diese Bedeutung von Vererbung findet auch in WPF Anwendung: In verschiedenen Basisklassen definierte Eigenschaften werden als Attribute für abgeleitete XAML-Klassen verfügbar gemacht, wenn sie als Elemente verwendet werden, und dem Code als Member bereitgestellt. Bei der Vererbung von Eigenschaftenwerten geht es insbesondere darum, wie Eigenschaftenwerte von einem Element an ein anderes vererbt werden können, und zwar basierend auf den untergeordneten/übergeordneten Beziehungen in einer Elementstruktur. Diese Elementstruktur ist bei der Schachtelung von Elementen in anderen Elementen direkt sichtbar, während Sie Anwendungen in XAML-Markup definieren. Objektstrukturen können auch programmgesteuert erstellt werden, indem Objekte designierten Auflistungen anderer Objekte hinzugefügt werden. Die Vererbung von Eigenschaftenwerten funktioniert in der fertigen Struktur zur Laufzeit auf die gleiche Weise.
Vererbung von Eigenschaftenwerten in der Praxis
Die WPFAPIs umfassen mehrere Eigenschaften, für die die Vererbung von Eigenschaftenwerten aktiviert ist. In der Regel sieht das Szenario für diese Eigenschaften so aus, dass sie eine Eigenschaft umfassen, die auch nur einmal pro Seite festgelegt werden kann, wobei diese Eigenschaft auch ein Member einer der Basiselementklassen ist und daher auch für die meisten der untergeordneten Elemente vorhanden ist. So steuert die FlowDirection-Eigenschaft zum Beispiel, in welcher Richtung fließender Inhalt dargestellt und auf der Seite angeordnet werden soll. Normalerweise soll das Textflusskonzept für alle untergeordneten Elemente konsistent gehandhabt werden. Falls die Flussrichtung aus irgendeinem Grund auf einer Ebene der Elementstruktur durch eine Benutzer- oder Umgebungsaktion zurückgesetzt wird, sollte sie normalerweise strukturübergreifend zurückgesetzt werden. Wenn die FlowDirection-Eigenschaft für die Vererbung aktiviert wurde, muss der Wert auf der Ebene in der Elementstruktur, die die Präsentationsanforderungen der einzelnen Seiten in der Anwendung umfasst, nur einmal festgelegt bzw. zurückgesetzt werden. Sogar der ursprüngliche Standardwert erbt auf diese Art und Weise. Das Modell der Eigenschaftenwertvererbung ermöglicht einzelnen Elementen jedoch weiterhin, den Wert in den seltenen Fällen zurückzusetzen, in denen eine Kombination von Flussrichtungen beabsichtigt ist.
Aktivieren der Vererbung einer benutzerdefinierten Eigenschaft
Indem Sie die Metadaten einer benutzerdefinierten Eigenschaft ändern, können Sie ihre eigenen benutzerdefinierten Eigenschaften für die Vererbung aktivieren. Beachten Sie jedoch, dass sich das Festlegen einer Eigenschaft als vererbbar auf die Leistung auswirkt. In dem Fall, in dem diese Eigenschaft nicht über einen festgelegten lokalen Wert verfügt bzw. über einen Wert, der über Stile, Vorlagen oder Datenbindung übernommen wird, stellt eine vererbbare Eigenschaft ihre zugewiesenen Werte allen untergeordneten Elementen in der logischen Struktur zur Verfügung.
Um eine Eigenschaft für die Wertevererbung zu aktivieren, erstellen Sie wie unter Gewusst wie: Registrieren einer angefügten Eigenschaft beschrieben eine benutzerdefinierte angefügte Eigenschaft. Registrieren Sie die Eigenschaft mit Metadaten (FrameworkPropertyMetadata), und geben Sie die "Inherits"-Option in den Optionseinstellungen für die Metadaten an. Stellen Sie außerdem sicher, dass die Eigenschaft über einen festgelegten Standardwert verfügt, da dieser Wert nun erbt. Obwohl Sie die Eigenschaft als angehängt registriert haben, können Sie ggf. einen Eigenschaften-"Wrapper" für den get/set-Zugriff auf den Besitzertyp erstellen, so wie dies bei einer "nicht angefügten" Abhängigkeitseigenschaft der Fall ist. Anschließend kann die vererbbare Eigenschaft entweder festgelegt werden, indem der direkte Eigenschaftenwrapper für den Besitzertyp oder abgeleitete Typen verwendet wird, oder sie kann mit der Syntax für angehängte Eigenschaften für ein DependencyObject festgelegt werden.
Das Konzept angehängter Eigenschaften ist demjenigen globaler Eigenschaften ähnlich; Sie können ein beliebiges DependencyObject auf den Wert überprüfen und ein gültiges Ergebnis erhalten. Ein typisches Szenario für angehängt Elemente ist, dass Eigenschaftenwerte für untergeordnete Elemente festgelegt werden. Das Szenario ist noch effektiver, wenn die betreffende Eigenschaft eine angehängte Eigenschaft ist, die stets implizit als angehängte Eigenschaft für jedes Element (DependencyObject) in der Struktur vorhanden ist.
Tipp
Obwohl das Vererben von Eigenschaftenwerten bei nicht angefügten Abhängigkeitseigenschaften anscheinend funktioniert, ist das Vererbungsverhalten bei einer nicht angefügten Eigenschaft über bestimmte Elementgrenzen in der Laufzeitstruktur nicht definiert. Verwenden Sie immer RegisterAttached zum Registrieren von Eigenschaften, wenn Sie Inherits in den Metadaten angeben.
Vererben von Eigenschaftenwerten über Strukturgrenzen hinweg
Das Vererben von Eigenschaften erfolgt durch das Durchlaufen einer Elementstruktur. Diese Struktur ist häufig parallel zur logischen Struktur. Wenn Sie jedoch ein WPF-Kernebenen-Objekt in das Markup einbeziehen, das eine Elementstruktur definiert, wie z. B. einen Brush, erstellen Sie eine nicht aufeinanderfolgende logische Struktur. Eine echte logische Struktur erstreckt sich konzeptionell nicht über den Brush, da die logische Struktur ein Konzept auf WPF-Frameworkebene darstellt. Dies spiegelt sich auch in den Ergebnissen wider, wenn Sie die Methoden von LogicalTreeHelper verwenden. Die Eigenschaftenwertvererbung kann diese Lücke in der logischen Struktur jedoch überbrücken und vererbte Werte trotzdem weiter übergeben, solange die vererbbare Eigenschaft als angehängte Eigenschaft registriert wurde und keine Begrenzung angetroffen wird, die die Vererbung absichtlich blockiert (wie z. B. Frame).
Siehe auch
Konzepte
Metadaten für Abhängigkeitseigenschaften