Dědičnost hodnoty vlastnosti

Dědičnost hodnot vlastností je funkce systému vlastností Windows Presentation Foundation (WPF). Dědičnost hodnot vlastností umožňuje podřízeným prvkům ve stromu prvků získat hodnotu konkrétní vlastnosti z nadřazených prvků a dědit tuto hodnotu tak, jak byla nastavena kdekoli v nejbližším nadřazeném elementu. Nadřazený prvek mohl také získat svou hodnotu prostřednictvím dědičnosti hodnot vlastností, takže systém se potenciálně rekuruje 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 iniciuje dědičnost hodnoty vlastnosti u podřízených elementů.

Dědičnost hodnot vlastností je dědičnost obsahů

"Dědičnost" zde není úplně stejný koncept jako dědičnost v kontextu typů a obecného objektově orientovaného 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 jsou použity jako prvky, a zpřístupněny jako členy pro kód. Dědičnost hodnot vlastností je zvláště o tom, jak mohou hodnoty vlastností dědit z jednoho prvku do druhého na základě vztahů nadřazený-podřízený v rámci stromu prvků. Tato stromová strukturu elementů je při vnořování prvků uvnitř jiných elementů při definování aplikací v kódu XAML nejvíce viditelná. 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 v dokončené stromové struktuře za běhu stejným způsobem.

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

Rozhraní API WPF zahrnují několik vlastností, které mají povolenou dědičnost vlastností. Scénářem pro tyto případy je obvykle to, že zahrnují vlastnost , kde je vhodné, aby byla vlastnost nastavena pouze jednou na stránku, ale kde je tato vlastnost také členem jedné z tříd základních elementů, a proto by existovala také na většině podřízených elementů. Například vlastnost určuje FlowDirection , který směr toku obsahu se má zobrazit a uspořádat na stránce. Obvykle chcete, aby byl koncept toku textu zpracováván konzistentně ve všech podřízených prvcích. Pokud byl směr toku z nějakého důvodu resetován na určité úrovni stromu elementů podle akce uživatele nebo prostředí, obvykle by se měl resetovat v celé struktuře. Když je FlowDirection vlastnost nastavena na dědění, je potřeba hodnotu nastavit nebo resetovat pouze jednou na úrovni stromu elementu, která zahrnuje prezentační potřeby jednotlivých stránek v aplikaci. Tímto způsobem se dědí i počáteční výchozí hodnota. 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 úmyslná kombinace směru toku.

Nastavení zděděné vlastní vlastnosti

Změnou metadat vlastní vlastnosti můžete také nastavit vlastní vlastnosti jako zděděné. Všimněte si ale, že při navrhování vlastnosti jako zděděné je třeba vzít v úvahu i výkon. V případech, kdy tato vlastnost nemá vytvořenou místní hodnotu nebo hodnotu získanou prostřednictvím stylů, šablon nebo datových vazeb, poskytuje zděděná vlastnost své 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 tématu Registrace připojené vlastnosti. Zaregistrujte vlastnost s metadaty (FrameworkPropertyMetadata) a v nastavení možností v rámci metadat zadejte možnost Dědí. Také se ujistěte, že má vlastnost nastavenou výchozí hodnotu, protože tato hodnota teď dědí. I když jste vlastnost zaregistrovali jako připojenou, můžete také vytvořit vlastnost "obálka" pro získání/nastavení přístupu k typu vlastníka, stejně jako u vlastnosti závislosti "nepřipojené". Potom je možné zděděnou vlastnost nastavit buď pomocí obálky přímých vlastností u typu vlastníka nebo odvozených typů, DependencyObjectnebo ji lze nastavit pomocí syntaxe připojené vlastnosti na libovolném objektu .

Připojené vlastnosti jsou koncepčně podobné globálním vlastnostem. Hodnotu můžete zkontrolovat na libovolném DependencyObject a získat platný výsledek. Typickým scénářem pro připojené vlastnosti je nastavení hodnot vlastností u podřízených elementů a tento scénář je efektivnější, pokud je sporná 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 vlastností funguje u vlastností nepřipojené závislosti, chování dědičnosti nepřipojené vlastnosti prostřednictvím určitých hranic prvků ve stromu za běhu není definováno. Vždy použijte k RegisterAttached 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. Při každém zahrnutí objektu základní úrovně WPF do značek, který definuje strom elementů, Brushjako je například , jste však vytvořili nepokračující logický strom. Skutečný logický strom není koncepčně rozšiřovat přes Brush, protože logický strom je koncept na úrovni architektury WPF. To se projeví ve výsledcích při použití metod .LogicalTreeHelper Dědičnost hodnot vlastností však může tuto mezeru v logickém stromu překlenout a může předat zděděné hodnoty, pokud byla zděděná vlastnost zaregistrována jako připojená vlastnost a Framenení zjištěna žádná úmyslná hranice blokování dědičnosti (například ).

Viz také