Metadata vlastností závislostí (WPF .NET)

Systém vlastností WINDOWS Presentation Foundation (WPF) obsahuje systém vytváření sestav metadat vlastností závislostí. Informace dostupné prostřednictvím systému generování sestav metadat překračují, co je k dispozici prostřednictvím reflexe nebo obecných charakteristik modulu CLR (Common Language Runtime). Při registraci vlastnosti závislosti máte možnost vytvořit a přiřadit k ní metadata. Pokud odvozujete z třídy, která definuje vlastnost závislosti, můžete přepsat metadata pro zděděnou vlastnost závislosti. A pokud třídu přidáte jako vlastníka vlastnosti závislosti, můžete přepsat metadata zděděné vlastnosti závislosti.

Důležité

Dokumentace k desktopové příručce pro .NET 7 a .NET 6 se právě připravuje.

Předpoklady

V článku se předpokládá základní znalost vlastností závislostí a že jste si přečetli přehled vlastností závislostí. Pokud chcete postupovat podle příkladů v tomto článku, pomůže vám to, pokud znáte jazyk XAML (Extensible Application Markup Language) a víte, jak psát aplikace WPF.

Jak se používají metadata

Můžete dotazovat metadata vlastností závislostí, abyste prozkoumali charakteristiky vlastnosti závislosti. Když systém vlastností zpracuje vlastnost závislosti, přistupuje k jeho metadatům. Objekt metadat vlastnosti závislosti obsahuje následující typy informací:

  • Výchozí hodnota vlastnosti závislosti, která je nastavena systémem vlastností, pokud se nepoužívá žádná jiná hodnota, například místní, styl nebo hodnota dědičnosti. Další informace o prioritě hodnot při přiřazování hodnot vlastností závislostí naleznete v tématu Priorita hodnoty vlastnosti závislostí.

  • Odkazy na zpětné volání zpětného volání hodnoty převodu a vlastnost mění zpětná volání typu vlastníka. Odkazy na zpětná volání, která mají modifikátor přístupu nebo jsou v rámci vašeho povoleného public oboru přístupu, můžete získat pouze odkazy. Další informace o zpětném volání vlastností závislostí naleznete v tématu Zpětné volání vlastností závislostí a ověřování.

  • Vlastnosti vlastností závislostí na úrovni architektury WPF (pokud je vlastnost závislosti vlastností architektury WPF). Procesy WPF, jako je modul rozložení architektury a logika dědičnosti vlastností, dotazování metadat na úrovni architektury WPF. Další informace naleznete v tématu Metadata vlastností rozhraní.

Rozhraní API metadat

Třída PropertyMetadata ukládá většinu metadat používaných systémem vlastností. Instance metadat je možné vytvářet a přiřazovat pomocí:

  • Typy, které registrují vlastnosti závislostí v systému vlastností.

  • Typy, které dědí z třídy definují vlastnost závislosti.

  • Typy, které se přidají jako vlastník vlastnosti závislosti.

Pokud typ registruje vlastnost závislosti bez zadání metadat, systém vlastností přiřadí PropertyMetadata objekt s výchozími hodnotami pro tento typ vlastnosti závislosti.

Pokud chcete načíst metadata pro vlastnost závislosti, zavolejte jedno z GetMetadata přetížení identifikátoru DependencyProperty . Metadata se vrátí jako PropertyMetadata objekt.

Konkrétnější třídy metadat odvozené z PropertyMetadata, existují pro různé architektonické oblasti. Podporuje například UIPropertyMetadata vytváření animačních sestav a FrameworkPropertyMetadata podporuje vlastnosti architektury WPF. Vlastnosti závislostí lze také zaregistrovat v odvozených PropertyMetadata třídách. I když GetMetadata vrátí PropertyMetadata objekt, pokud je to možné přetypovat na odvozený typ, abyste prozkoumali vlastnosti specifické pro typ.

Vlastnosti, které jsou vystaveny FrameworkPropertyMetadata , jsou někdy označovány jako příznaky. Při vytváření FrameworkPropertyMetadata instance máte možnost předat instanci typu FrameworkPropertyMetadataOptions výčtu do konstruktoru FrameworkPropertyMetadata . FrameworkPropertyMetadataOptions umožňuje zadat příznaky metadat v bitové kombinaci. Použití FrameworkPropertyMetadataFrameworkPropertyMetadataOptions k zachování délky podpisu konstruktoru přiměřené. Při registraci vlastností závislostí jsou příznaky metadat, které jste nastavili FrameworkPropertyMetadataOptions , zpřístupněny jako FrameworkPropertyMetadataBoolean vlastnosti, nikoli bitové kombinace příznaků, aby byly vlastnosti metadat dotazování intuitivnější.

Chcete přepsat nebo vytvořit nová metadata?

Když dědíte vlastnost závislosti, máte možnost změnit vlastnosti vlastnosti závislosti přepsáním jeho metadat. Scénář vlastnosti závislostí ale nemusí být vždy možné provést přepsáním metadat a někdy je nutné definovat vlastní vlastnost závislosti ve třídě s novými metadaty. Vlastní vlastnosti závislostí mají stejné možnosti jako vlastnosti závislostí definované typy WPF. Další informace naleznete v tématu Vlastní vlastnosti závislostí.

Jednou z charakteristik vlastnosti závislosti, kterou nemůžete přepsat, je její typ hodnoty. Pokud zděděná vlastnost závislosti má přibližné chování, které potřebujete, ale váš scénář vyžaduje jiný typ hodnoty, zvažte implementaci vlastní vlastnosti závislosti. Hodnoty vlastností můžete propojit prostřednictvím převodu typu nebo jiné implementace v odvozené třídě.

Scénáře přepsání metadat

Příklady scénářů přepsání existujících metadat vlastností závislostí jsou:

  • Změna výchozí hodnoty, což je běžný scénář.

  • Změna nebo přidání zpětného volání změn vlastností, které mohou být nezbytné, pokud zděděná vlastnost závislostí komunikuje s jinými vlastnostmi závislosti odlišně než její základní implementace. Jednou z charakteristik programovacího modelu, který podporuje kód i revize, je, že hodnoty vlastností mohou být nastaveny v libovolném pořadí. Tento faktor může ovlivnit způsob implementace zpětného volání změn vlastností. Další informace naleznete v tématu Zpětné volání vlastností závislostí a ověření.

  • Změna možností metadat vlastností rozhraní WPF Při registraci nové vlastnosti závislosti jsou obvykle nastaveny možnosti metadat, ale můžete je označit nebo OverrideMetadataAddOwner volat. Další informace o přepsání metadat vlastností architektury naleznete v tématu Určení FrameworkPropertyMetadata. Informace o nastavení možností metadat vlastností architektury při registraci vlastnosti závislosti naleznete v tématu Vlastní vlastnosti závislosti.

Poznámka:

Vzhledem k tomu, že zpětná volání ověřování nejsou součástí metadat, nelze je změnit přepsáním metadat. Další informace naleznete v tématu Zpětná volání ověřovací hodnoty.

Přepsání metadat

Při implementaci nové vlastnosti závislosti můžete jeho metadata nastavit pomocí přetížení Register metody. Pokud vaše třída dědí vlastnost závislosti, můžete přepsat zděděné hodnoty metadat pomocí OverrideMetadata metody. Můžete například použít OverrideMetadata k nastavení hodnot specifických pro typ. Další informace a ukázky kódu naleznete v tématu Přepsání metadat pro vlastnost závislosti.

Příkladem vlastnosti závislosti WPF je Focusable. Třída FrameworkElement registruje Focusable. Třída Control je odvozena z FrameworkElement, dědí Focusable závislost vlastnost a přepíše zděděná metadata vlastnosti. Přepsání změní výchozí hodnotu vlastnosti z false na true, ale zachová jiné zděděné hodnoty metadat.

Vzhledem k tomu, že většina existujících vlastností závislostí není virtuálními vlastnostmi, jejich zděděná implementace stínuje existujícího člena. Když přepíšete charakteristiku metadat, nahradí nová hodnota metadat původní hodnotu nebo se sloučí:

  • DefaultValueNová hodnota nahradí stávající výchozí hodnotu. Pokud nezadáte DefaultValue v metadatech přepsání, hodnota pochází z nejbližšího nadřazeného objektu zadaného DefaultValue v metadatech.

  • Výchozí logika PropertyChangedCallbacksloučení ukládá všechny PropertyChangedCallback hodnoty v tabulce a všechny jsou vyvolány při změně vlastnosti. Pořadí zpětného volání je určeno hloubkou třídy, kdy se nejprve spustí zpětné volání registrované základní třídou v hierarchii.

  • CoerceValueCallbackNová hodnota nahradí stávající CoerceValueCallback hodnotu. Pokud nezadáte CoerceValueCallback v metadatech přepsání, hodnota pochází z nejbližšího nadřazeného objektu zadaného CoerceValueCallback v metadatech.

Poznámka:

Metoda implementuje výchozí logiku Merge sloučení. Vlastní logiku sloučení můžete zadat v odvozené třídě, která dědí vlastnost závislosti přepsáním Merge v této třídě.

Přidání třídy jako vlastníka

Chcete-li "dědit" vlastnost závislosti zaregistrovanou v jiné hierarchii tříd, použijte metodu AddOwner . Tato metoda se obvykle používá, když přidání třídy není odvozeno z typu, který zaregistroval vlastnost závislosti. AddOwner Ve volání může přidání třídy vytvořit a přiřadit metadata specifická pro typ pro zděděnou vlastnost závislosti. Chcete-li být úplným účastníkem systému vlastností prostřednictvím kódu a revize, přidání třídy by mělo implementovat tyto veřejné členy:

  • Pole identifikátoru vlastnosti závislosti. Hodnota identifikátoru vlastnosti závislosti je návratová hodnota AddOwner volání. Toto pole by mělo být public static readonly pole typu DependencyProperty.

  • Obálka CLR, která implementuje a set přistupujíget. Při použití obálky vlastností mohou spotřebitelé vlastností závislostí získat nebo nastavit hodnoty vlastností závislostí stejně jako jakékoli jiné vlastnosti CLR. Objekty get a set přístupové objekty komunikují se systémem základních vlastností prostřednictvím DependencyObject.GetValue a DependencyObject.SetValue voláními a předávají identifikátor vlastnosti závislosti jako parametr. Implementujte obálku stejným způsobem jako při registraci vlastní vlastnosti závislosti. Další informace naleznete v tématu Vlastní vlastnosti závislostí

Třída, která volá AddOwner , má stejné požadavky na zveřejnění objektového modelu zděděné vlastnosti závislostí jako třídy, která definuje novou vlastní vlastnost závislosti. Další informace naleznete v tématu Přidání typu vlastníka pro vlastnost závislosti.

Metadata připojených vlastností

Ve WPF se většina připojených vlastností uživatelského rozhraní u typů WPF implementuje jako vlastnosti závislosti. Připojené vlastnosti implementované jako vlastnosti závislosti podporují koncepty vlastností závislostí, jako jsou metadata, která odvozené třídy mohou přepsat. Metadata připojené vlastnosti se obecně neliší od vlastnosti závislosti. U instancí přepisované třídy můžete přepsat výchozí hodnotu, změnit zpětná volání a vlastnosti rozhraní WPF pro zděděnou připojenou vlastnost. Další informace naleznete v tématu Metadata připojených vlastností

Poznámka:

Vždy se používá RegisterAttached k registraci vlastností, které zadáte Inherits v metadatech. I když se může zdát, že dědičnost hodnot vlastností může fungovat pro neattachované vlastnosti závislosti, chování dědičnosti hodnot pro neapojenou vlastnost prostřednictvím určitých dělení objektů objektu ve stromu modulu runtime není definováno. Vlastnost Inherits není relevantní pro nepřipojené vlastnosti. Další informace naleznete RegisterAttached(String, Type, Type, PropertyMetadata)v části Inheritspoznámky .

Přidání třídy jako vlastníka připojené vlastnosti

Chcete-li dědit připojenou vlastnost z jiné třídy, ale vystavit ji jako neopojenou závislost vlastnost ve vaší třídě:

  • Voláním AddOwner přidejte třídu jako vlastníka připojené vlastnosti závislosti.

  • Přiřaďte návratovou AddOwner hodnotu volání k public static readonly poli, která se použije jako identifikátor vlastnosti závislosti.

  • Definujte obálku CLR, která přidá vlastnost jako člena třídy a podporuje nepopojené použití vlastnosti.

Viz také