Dědičnost hodnoty vlastnosti

Dědičnost hodnot vlastností je funkce systému vlastností WINDOWS Presentation Foundation (WPF). Dědičnost hodnoty vlastnosti umožňuje podřízeným prvkům ve stromu elementů získat hodnotu konkrétní vlastnosti z nadřazených prvků, dědí ji tak, jak byla nastavena kdekoli v nejbližším nadřazené elementu. Nadřazený prvek mohl také získat jeho hodnotu prostřednictvím dědičnosti hodnoty vlastnosti, takže systém potenciálně rekurzuje až do kořenového adresáře stránky. Dědičnost hodnot vlastností není výchozím chováním systému vlastností; Vlastnost musí být vytvořena s konkrétním nastavením metadat, aby tato vlastnost mohla inicializovat dědičnost hodnot vlastností u podřízených prvků.

Dědičnost hodnot vlastností je dědičnost zahrnutí

"Dědičnost" jako pojem zde není zcela stejný koncept jako dědičnost v kontextu typů a obecné objektově orientované programování, kde odvozené třídy dědí definice členů ze svých základních tříd. Tento význam dědičnosti je také aktivní ve WPF: vlastnosti definované v různých základních třídách jsou vystaveny jako atributy pro odvozené třídy XAML, pokud se používají jako elementy, a vystaveny jako členy kódu. Dědičnost hodnot vlastností je zejména o tom, jak hodnoty vlastností mohou dědit z jednoho prvku do druhého na základě vztahů nadřazený-podřízený v rámci stromu prvků. Tento strom prvků je nejvíce viditelný při vnoření prvků uvnitř jiných prvků při definování aplikací v kódu XAML. Stromy objektů lze také vytvořit programově přidáním objektů do určených kolekcí jiných objektů a dědičnost hodnot vlastností funguje stejně jako u dokončeného stromu za běhu.

Praktické použití dědičnosti hodnot vlastností

Rozhraní API WPF zahrnují několik vlastností, které mají povolenou dědičnost vlastností. Obvykle se jedná o scénář, který zahrnuje vlastnost, kde je vhodné nastavit vlastnost pouze jednou na stránku, ale kde je tato vlastnost také členem jedné ze základních tříd elementů, a proto by také existoval u většiny podřízených prvků. Například vlastnost určuje, FlowDirection který směr toku obsahu má být prezentován a uspořádán na stránce. Obvykle chcete, aby se koncept toku textu zpracovával konzistentně ve všech podřízených prvcích. Pokud byl směr toku z nějakého důvodu resetován v určité úrovni stromu prvků podle akce uživatele nebo prostředí, měl by se obvykle resetovat v celém prostředí. FlowDirection Když je vlastnost zděděna, je nutné nastavit nebo resetovat hodnotu pouze jednou na úrovni ve stromu prvků, který zahrnuje potřeby prezentace každé stránky v aplikaci. I počáteční výchozí hodnota se tímto způsobem zdědí. Model dědičnosti hodnot vlastností stále umožňuje jednotlivým prvkům resetovat hodnotu ve výjimečných případech, kdy je záměrná kombinace směrů toku.

Vytvoření vlastní zděděné vlastnosti

Změnou metadat vlastní vlastnosti můžete také vytvořit vlastní vlastnosti, které lze zdědit. Upozorňujeme však, že určení vlastnosti jako zděděné má určité aspekty výkonu. V případech, kdy tato vlastnost nemá vytvořenou místní hodnotu nebo hodnotu získanou prostřednictvím stylů, šablon nebo datové vazby, zděděná vlastnost poskytuje jeho přiřazené hodnoty vlastností všem podřízeným prvkům v logickém stromu.

Pokud chcete, aby se vlastnost účastnila dědičnosti hodnot, vytvořte vlastní připojenou vlastnost, jak je popsáno v části Registrace připojené vlastnosti. Zaregistrujte vlastnost pomocí metadat (FrameworkPropertyMetadata) a v nastavení možností v rámci metadat zadejte možnost Dědit. Také se ujistěte, že vlastnost má nastavenou výchozí hodnotu, protože tato hodnota bude nyní dědit. I když jste vlastnost zaregistrovali jako připojenou, můžete také vytvořit vlastnost "obálka" pro získání/nastavení přístupu u typu vlastníka, stejně jako u vlastnosti závislosti "bez připojení". Potom lze zděděděnou vlastnost buď nastavit pomocí obálky přímé vlastnosti u typu vlastníka nebo odvozených typů, nebo lze nastavit pomocí syntaxe připojené vlastnosti na libovolném DependencyObject.

Připojené vlastnosti jsou koncepčně podobné globálním vlastnostem; můžete zkontrolovat hodnotu u libovolné DependencyObject hodnoty a získat platný výsledek. Typickým scénářem připojených vlastností je nastavení hodnot vlastností u podřízených prvků a tento scénář je efektivnější, pokud je daná vlastnost připojená vlastnost, která je vždy implicitně přítomna jako připojená vlastnost u každého prvku (DependencyObject) ve stromu.

Poznámka:

I když se může zdát, že dědičnost hodnot vlastnosti vlastnosti není součástí, chování dědičnosti pro neapojenou vlastnost prostřednictvím určitých hranic prvků ve stromu runtime není definováno. Vždy se používá RegisterAttached k registraci vlastností, které zadáte Inherits v metadatech.

Dědění hodnot vlastností přes hranice stromu

Dědičnost vlastností funguje procházením stromu prvků. Tento strom je často paralelní s logickým stromem. Kdykoli však do revize zahrnete objekt základní úrovně WPF, který definuje strom elementu, například Brush, jste vytvořili nesouvisený logický strom. Skutečný logický strom se koncepčně neprovádí Brush, protože logický strom je koncept na úrovni architektury WPF. Můžete to vidět ve výsledcích při použití metod LogicalTreeHelper. Dědičnost hodnot vlastností však může překlenout tuto mezeru v logickém stromu a stále může předávat zděděné hodnoty, pokud byla zděděná vlastnost zaregistrována jako připojená vlastnost a není zjištěna žádná úmyslná hranice blokování dědičnosti (například Frame) .

Viz také