Metadane właściwości zależności (WPF .NET)

System właściwości Windows Presentation Foundation (WPF) zawiera system raportowania metadanych właściwości zależności. Informacje dostępne w systemie raportowania metadanych przekraczają to, co jest dostępne za pośrednictwem odbicia lub ogólnych cech środowiska uruchomieniowego języka wspólnego (CLR). Podczas rejestrowania właściwości zależności możesz utworzyć i przypisać do niej metadane. Jeśli pochodzisz z klasy, która definiuje właściwość zależności, możesz zastąpić metadane dla dziedziczonej właściwości zależności. Jeśli dodasz klasę jako właściciela właściwości zależności, możesz zastąpić metadane dziedziczonej właściwości zależności.

Ważne

Dokumentacja przewodnika dla komputerów dla platform .NET 7 i .NET 6 jest w budowie.

Wymagania wstępne

W tym artykule przyjęto założenie, że masz podstawową wiedzę na temat właściwości zależności i zapoznasz się z omówieniem właściwości zależności. Aby postępować zgodnie z przykładami w tym artykule, warto zapoznać się z językiem Extensible Application Markup Language (XAML) i wiedzieć, jak pisać aplikacje WPF.

Jak są używane metadane

Możesz wykonać zapytanie o metadane właściwości zależności, aby zbadać cechy właściwości zależności. Gdy system właściwości przetwarza właściwość zależności, uzyskuje dostęp do metadanych. Obiekt metadanych dla właściwości zależności zawiera następujące typy informacji:

  • Wartość domyślna właściwości zależności, która jest ustawiana przez system właściwości, gdy żadna inna wartość nie ma zastosowania, na przykład lokalna, styl lub wartość dziedziczenia. Aby uzyskać więcej informacji na temat pierwszeństwa wartości w czasie wykonywania wartości właściwości zależności, zobacz Pierwszeństwo wartości właściwości zależności.

  • Odwołania do wywołań zwrotnych wartości przymusu i zmiany wywołań zwrotnych właściwości w typie właściciela. Można uzyskać odwołania tylko do wywołań zwrotnych, które mają public modyfikator dostępu lub znajdują się w dozwolonym zakresie dostępu. Aby uzyskać więcej informacji na temat wywołań zwrotnych właściwości zależności, zobacz Wywołania zwrotne właściwości zależności i walidacja.

  • Właściwości zależności na poziomie platformy WPF (jeśli właściwość zależności jest właściwością struktury WPF). Procesy WPF, takie jak aparat układu struktury i logika dziedziczenia właściwości, wysyłają zapytania do metadanych na poziomie struktury WPF. Aby uzyskać więcej informacji, zobacz Metadane właściwości struktury.

Interfejsy API metadanych

Klasa PropertyMetadata przechowuje większość metadanych używanych przez system właściwości. Wystąpienia metadanych można tworzyć i przypisywać przez:

  • Typy rejestrujące właściwości zależności w systemie właściwości.

  • Typy dziedziczone z klasy definiującej właściwość zależności.

  • Typy, które dodają się jako właściciel właściwości zależności.

Jeśli typ rejestruje właściwość zależności bez określania metadanych, system właściwości przypisuje PropertyMetadata obiekt z wartościami domyślnymi dla tego typu do właściwości zależności.

Aby pobrać metadane dla właściwości zależności, wywołaj jedno z GetMetadata przeciążeń identyfikatora DependencyProperty . Metadane są zwracane jako PropertyMetadata obiekt.

Bardziej szczegółowe klasy metadanych, pochodzące z PropertyMetadataklasy , istnieją dla różnych obszarów architektury. Na przykład UIPropertyMetadata obsługuje raportowanie animacji i FrameworkPropertyMetadata obsługuje właściwości struktury WPF. Właściwości zależności można również zarejestrować w klasach pochodnych PropertyMetadata . Mimo że GetMetadata zwraca PropertyMetadata obiekt, jeśli ma to zastosowanie, można rzutować do typu pochodnego w celu zbadania właściwości specyficznych dla typu.

Właściwości, które są narażone przez FrameworkPropertyMetadata element, są czasami określane jako flagi. Podczas tworzenia FrameworkPropertyMetadata wystąpienia można przekazać wystąpienie typu FrameworkPropertyMetadataOptions wyliczenia do konstruktora FrameworkPropertyMetadata . FrameworkPropertyMetadataOptions umożliwia określenie flag metadanych w kombinacji bitowej. Użycie FrameworkPropertyMetadataFrameworkPropertyMetadataOptions w celu zachowania rozsądnej długości podpisu konstruktora. W przypadku rejestracji właściwości zależności flagi metadanych, które ustawiono FrameworkPropertyMetadataOptions na, są uwidocznione jako FrameworkPropertyMetadataBoolean właściwości, a nie bitowe kombinacje flag, aby bardziej intuicyjne właściwości metadanych.

Czy zastąpić lub utworzyć nowe metadane?

Gdy dziedziczysz właściwość zależności, możesz zmienić cechy właściwości zależności przez zastąpienie jej metadanych. Jednak może nie zawsze być w stanie wykonać scenariusz właściwości zależności przez zastąpienie metadanych, a czasami konieczne jest zdefiniowanie niestandardowej właściwości zależności w klasie z nowymi metadanymi. Właściwości zależności niestandardowych mają takie same możliwości jak właściwości zależności zdefiniowane przez typy WPF. Aby uzyskać więcej informacji, zobacz Właściwości zależności niestandardowych.

Jedną z cech właściwości zależności, której nie można zastąpić, jest jego typ wartości. Jeśli dziedziczona właściwość zależności ma przybliżone zachowanie, ale scenariusz wymaga innego typu wartości, rozważ zaimplementowanie niestandardowej właściwości zależności. Możesz połączyć wartości właściwości za pomocą konwersji typów lub inną implementację w klasie pochodnej.

Scenariusze zastępowania metadanych

Przykładowe scenariusze zastępowania istniejących metadanych właściwości zależności to:

  • Zmiana wartości domyślnej, która jest typowym scenariuszem.

  • Zmiana lub dodanie wywołań zwrotnych zmiany właściwości, co może być konieczne, jeśli dziedziczona właściwość zależności współdziała z innymi właściwościami zależności inaczej niż implementacja podstawowa. Jedną z cech modelu programowania, który obsługuje zarówno kod, jak i znacznik, jest to, że wartości właściwości mogą być ustawiane w dowolnej kolejności. Ten czynnik może mieć wpływ na sposób implementowania wywołań zwrotnych zmiany właściwości. Aby uzyskać więcej informacji, zobacz Wywołania zwrotne właściwości zależności i walidacja.

  • Zmiana opcji metadanych właściwości struktury WPF. Zazwyczaj opcje metadanych są ustawiane podczas rejestracji nowej właściwości zależności, ale można je ponownie określić w OverrideMetadata wywołaniach lub AddOwner . Aby uzyskać więcej informacji na temat zastępowania metadanych właściwości struktury, zobacz Określanie strukturyPropertyMetadata. Aby uzyskać informacje na temat ustawiania opcji metadanych właściwości struktury podczas rejestrowania właściwości zależności, zobacz Niestandardowe właściwości zależności.

Uwaga

Ponieważ wywołania zwrotne weryfikacji nie są częścią metadanych, nie można ich zmienić przez zastępowanie metadanych. Aby uzyskać więcej informacji, zobacz Wywołania zwrotne wartości walidacji.

Zastępowanie metadanych

Podczas implementowania nowej właściwości zależności można ustawić jej metadane przy użyciu przeciążeń Register metody . Jeśli klasa dziedziczy właściwość zależności, możesz zastąpić dziedziczone wartości metadanych przy użyciu OverrideMetadata metody . Na przykład możesz użyć OverrideMetadata polecenia , aby ustawić wartości specyficzne dla typu. Aby uzyskać więcej informacji i przykładów kodu, zobacz Zastępowanie metadanych dla właściwości zależności.

Przykładem właściwości zależności WPF jest Focusable. Klasa FrameworkElement rejestruje Focusableelement . Klasa Control pochodzi z FrameworkElementklasy , dziedziczy Focusable właściwość zależności i zastępuje dziedziczone metadane właściwości. Zastąpienie zmienia domyślną wartość właściwości z false na true, ale zachowuje inne dziedziczone wartości metadanych.

Ponieważ większość istniejących właściwości zależności nie jest właściwościami wirtualnymi, ich dziedziczona implementacja w tle istniejącego elementu członkowskiego. Po zastąpieniu charakterystyki metadanych nowa wartość metadanych zastępuje oryginalną wartość lub jest scalona:

  • W przypadku DefaultValueelementu nowa wartość zastąpi istniejącą wartość domyślną. Jeśli nie określisz DefaultValue elementu w metadanych przesłonięcia, wartość pochodzi z najbliższego obiektu nadrzędnego określonego DefaultValue w metadanych.

  • W przypadku PropertyChangedCallbackelementu domyślna logika scalania przechowuje wszystkie PropertyChangedCallback wartości w tabeli, a wszystkie są wywoływane przy zmianie właściwości. Kolejność wywołania zwrotnego jest określana przez głębokość klasy, gdzie wywołanie zwrotne zarejestrowane przez klasę bazową w hierarchii będzie uruchamiane jako pierwsze.

  • W przypadku elementu CoerceValueCallbacknowa wartość zastąpi istniejącą CoerceValueCallback wartość. Jeśli nie określisz CoerceValueCallback elementu w metadanych przesłonięcia, wartość pochodzi z najbliższego obiektu nadrzędnego określonego CoerceValueCallback w metadanych.

Uwaga

Domyślna logika scalania jest implementowana przez metodę Merge . Niestandardową logikę scalania można określić w klasie pochodnej, która dziedziczy właściwość zależności, przesłaniając Merge ją w tej klasie.

Dodawanie klasy jako właściciela

Aby "dziedziczyć" właściwość zależności zarejestrowaną w innej hierarchii klas, użyj AddOwner metody . Ta metoda jest zwykle używana, gdy klasa dodawania nie pochodzi z typu, który zarejestrował właściwość zależności. W wywołaniu AddOwner dodawanie klasy może tworzyć i przypisywać metadane specyficzne dla typu dla właściwości dziedziczonej zależności. Aby być pełnym uczestnikiem systemu właściwości, za pomocą kodu i znaczników, klasa dodawania powinna implementować następujące publiczne elementy członkowskie:

  • Pole identyfikatora właściwości zależności. Wartość identyfikatora właściwości zależności jest wartością zwracaną wywołania AddOwner . To pole powinno być polem public static readonly typu DependencyProperty.

  • Otoka CLR, która implementuje get i set metody dostępu. Korzystając z otoki właściwości, użytkownicy właściwości zależności mogą pobierać lub ustawiać wartości właściwości zależności, tak samo jak każda inna właściwość CLR. Metody get i set współdziałają z podstawowym systemem właściwości za pomocą wywołań DependencyObject.GetValue i DependencyObject.SetValue przekazując identyfikator właściwości zależności jako parametr. Zaimplementuj otokę w taki sam sposób, jak podczas rejestrowania niestandardowej właściwości zależności. Aby uzyskać więcej informacji, zobacz Niestandardowe właściwości zależności

Klasa, która wywołuje AddOwner , ma te same wymagania dotyczące uwidaczniania modelu obiektów właściwości zależności dziedziczonej jako klasy, która definiuje nową niestandardową właściwość zależności. Aby uzyskać więcej informacji, zobacz Dodawanie typu właściciela dla właściwości zależności.

Metadane dołączonej właściwości

W WPF większość właściwości dołączonych interfejsu użytkownika w typach WPF jest implementowana jako właściwości zależności. Dołączone właściwości zaimplementowane jako właściwości zależności obsługują koncepcje właściwości zależności, takie jak metadane, które klasy pochodne mogą zastąpić. Metadane dołączonej właściwości zwykle nie różnią się od właściwości zależności. Można zastąpić wartość domyślną, wywołania zwrotne zmiany właściwości i właściwości struktury WPF dla dziedziczonej właściwości dołączonej w wystąpieniach zastępowania klasy. Aby uzyskać więcej informacji, zobacz Dołączone metadane właściwości

Uwaga

Zawsze służy RegisterAttached do rejestrowania właściwości, które są określone Inherits w metadanych. Mimo że dziedziczenie wartości właściwości może działać dla nieprzyłączone właściwości zależności, zachowanie dziedziczenia wartości dla właściwości nieprzyłączonej za pośrednictwem niektórych podziałów obiektów w drzewie środowiska uruchomieniowego jest niezdefiniowane. Właściwość Inherits nie jest odpowiednia dla właściwości nieprzyłączanych. Aby uzyskać więcej informacji, zobacz RegisterAttached(String, Type, Type, PropertyMetadata)sekcję i uwagi w temacie Inherits.

Dodawanie klasy jako właściciela dołączonej właściwości

Aby dziedziczyć dołączoną właściwość z innej klasy, ale uwidaczniać ją jako nieprzyłączoną właściwość zależności dla klasy:

  • Wywołaj metodę AddOwner , aby dodać klasę jako właściciela dołączonej właściwości zależności.

  • Przypisz wartość AddOwner zwracaną wywołania do public static readonly pola, aby użyć go jako identyfikatora właściwości zależności.

  • Zdefiniuj otokę CLR, która dodaje właściwość jako składową klasy i obsługuje nieprzyłączone użycie właściwości.

Zobacz też