Udostępnij za pośrednictwem


Metadane właściwości frameworku (WPF .NET)

Opcje metadanych właściwości struktury dla właściwości zależności można ustawić na poziomie struktury Windows Presentation Foundation (WPF). Oznaczenie poziomu platformy WPF ma zastosowanie, gdy interfejsy API prezentacji WPF i pliki wykonywalne obsługują renderowanie i powiązanie danych. Interfejsy API do prezentacji i pliki wykonywalne zapytują o FrameworkPropertyMetadata właściwości zależności.

Warunki wstępne

Artykuł zakłada, że masz podstawową wiedzę na temat właściwości zależności i że już zapoznałeś 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.

Kategorie metadanych właściwości struktury

FrameworkPropertyMetadata należy do następujących kategorii:

  • Metadane wpływające na układ elementu, w szczególności flagi metadanych AffectsArrange, AffectsMeasurei AffectsRender. Możesz ustawić te flagi, jeśli implementacja właściwości zależności ma wpływ na aspekt wizualny i implementujesz MeasureOverride lub ArrangeOverride w klasie. Metody MeasureOverride i ArrangeOverride dostarczają systemowi układu informacji o zachowaniu specyficznym dla implementacji i o sposobie renderowania. Gdy AffectsArrange, AffectsMeasurelub AffectsRender są ustawione na true w metadanych właściwości zależności i jej efektywna wartość ulega zmianie, system właściwości WPF zainicjuje żądanie unieważnienia wizualizacji elementu, aby wyzwolić ponowne rysowanie.

  • Metadane wpływające na układ elementu nadrzędnego, szczególnie flagi metadanych AffectsParentArrange i AffectsParentMeasure. Przykłady właściwości zależności WPF, które ustawiają te flagi, są FixedPage.Left i Paragraph.KeepWithNext.

  • Metadane dotyczące dziedziczenia wartości właściwości, w szczególności flagi Inherits i OverridesInheritanceBehavior. Domyślnie właściwości zależności nie dziedziczą wartości. OverridesInheritanceBehavior umożliwia ścieżce dziedziczenia przechodzenie do drzewa wizualnego, co jest niezbędne w przypadku niektórych scenariuszy kompozycji kontrolek. Aby uzyskać więcej informacji, zobacz dziedziczenie wartości właściwości.

    Notatka

    Termin "dziedziczy" w kontekście wartości właściwości jest specyficzny dla właściwości zależności i nie odnosi się bezpośrednio do zarządzanych typów kodu i dziedziczenia składowych za pośrednictwem typów pochodnych. W kontekście właściwości zależności oznacza to, że elementy podrzędne mogą dziedziczyć wartości tych właściwości od elementów nadrzędnych.

  • Metadane powiązania danych, w szczególności flagi metadanych BindsTwoWayByDefault i IsNotDataBindable. Domyślnie właściwości zależności w strukturze WPF obsługują powiązanie jednokierunkowe. Rozważ ustawienie powiązania dwukierunkowego jako domyślnego dla właściwości, które raportują stan; i mogą być modyfikowane przez użytkownika, na przykład IsSelected. Należy również rozważyć ustawienie dwukierunkowego powiązania jako ustawienia domyślnego, gdy użytkownicy kontrolki oczekują, że właściwość je zaimplementuje, na przykład TextBox.Text. BindsTwoWayByDefault wpływa tylko na domyślny tryb powiązania. Aby zmienić kierunek przepływu danych w powiązaniu, ustaw Binding.Mode. Można użyć IsNotDataBindable, aby wyłączyć powiązanie danych, gdy nie ma dla niego przypadku użycia. Aby uzyskać więcej informacji na temat powiązań danych, zobacz Omówienie powiązania danych.

  • Rejestrowanie metadanych, w szczególności flaga metadanych Journal. Wartość domyślna flagi Journal jest true tylko dla niektórych właściwości zależności, takich jak SelectedIndex. Kontrolki wejściowe użytkownika powinny ustawiać flagę Journal dla właściwości, których wartości zawierają wybory użytkowników do przechowania. Flaga Journal jest odczytywana przez aplikacje lub usługi obsługujące dzienniki, w tym usługi dziennika WPF. Aby uzyskać informacje na temat przechowywania kroków nawigacji, zobacz omówienie nawigacji .

FrameworkPropertyMetadata pochodzi bezpośrednio z UIPropertyMetadatai implementuje flagi omówione tutaj. Jeśli nie zostanie ustawiona specjalnie, flagi FrameworkPropertyMetadata mają domyślną wartość false.

Odczytywanie FrameworkPropertyMetadata

Aby pobrać metadane dla właściwości zależności, wywołaj GetMetadata na identyfikatorze DependencyProperty. Wywołanie GetMetadata zwraca obiekt PropertyMetadata. Jeśli potrzebujesz pobrać wartości metadanych z ram architektonicznych, przekonwertuj PropertyMetadata na FrameworkPropertyMetadata.

Określanie elementu FrameworkPropertyMetadata

Podczas rejestrowania właściwości zależności możesz utworzyć i przypisać do niej metadane. Przypisany obiekt metadanych może być PropertyMetadata lub jedną z jego klas pochodnych, takich jak FrameworkPropertyMetadata. Wybierz FrameworkPropertyMetadata dla właściwości zależności, które opierają się na API prezentacyjnych WPF i plikach wykonywalnych do renderowania i powiązań danych. Bardziej zaawansowaną opcją jest wyprowadzenie z FrameworkPropertyMetadata, aby stworzyć niestandardową klasę raportowania metadanych z większą liczbą flag. Możesz też użyć UIPropertyMetadata dla właściwości innych niż struktury, które mają wpływ na renderowanie interfejsu użytkownika.

Opcje metadanych są zwykle ustawiane podczas rejestracji nowej właściwości zależności, mimo że można je ponownie określić w wywołaniach OverrideMetadata lub AddOwner. Podczas zastępowania metadanych zawsze używaj tego samego typu metadanych, który był użyty przy rejestracji właściwości.

Właściwości, które są uwidocznione przez FrameworkPropertyMetadata, są czasami określane jako flagi . Jeśli tworzysz wystąpienie FrameworkPropertyMetadata, istnieją dwa sposoby wypełniania wartości flagi:

  1. Ustaw flagi na wystąpieniu typu wyliczenia FrameworkPropertyMetadataOptions. FrameworkPropertyMetadataOptions pozwala określić flagi metadanych w bitowej kombinacji OR. Następnie zainicjuj wystąpienie FrameworkPropertyMetadata za pomocą konstruktora z parametrem FrameworkPropertyMetadataOptions i przekaż wystąpienie FrameworkPropertyMetadataOptions. Aby zmienić flagi metadanych po przekazaniu FrameworkPropertyMetadataOptions do konstruktora FrameworkPropertyMetadata, należy zmienić odpowiednią właściwość w nowym wystąpieniu FrameworkPropertyMetadata. Jeśli na przykład ustawisz flagę FrameworkPropertyMetadataOptions.NotDataBindable, możesz ją cofnąć, ustawiając FrameworkPropertyMetadata.IsNotDataBindable na false.

  2. Utwórz wystąpienie FrameworkPropertyMetadata, używając konstruktora bez parametru FrameworkPropertyMetadataOptions, a następnie ustaw odpowiednie flagi Boolean dla FrameworkPropertyMetadata. Ustaw wartości flagi przed skojarzeniem wystąpienia FrameworkPropertyMetadata z właściwością zależności. W przeciwnym razie otrzymasz InvalidOperationException.

Zachowanie zastępowania metadanych

Podczas zastępowania metadanych właściwości struktury, nowe wartości metadanych albo zastępują, albo są scalane z oryginalnymi wartościami.

  • W przypadku PropertyChangedCallbackdomyślna logika scalania zachowuje poprzednie wartości PropertyChangedCallback 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 w hierarchii wywołanie zwrotne zarejestrowane przez klasę bazową uruchomi się jako pierwsze. Dziedziczone wywołania zwrotne są uruchamiane tylko raz i są własnością klasy, która dodała je do metadanych.

  • W przypadku DefaultValuenowa wartość zastąpi istniejącą wartość domyślną. Jeśli nie określisz DefaultValue w metadanych przesłonięcia, a istniejąca FrameworkPropertyMetadata ma ustawioną flagę Inherits, wartość domyślna pochodzi z najbliższego obiektu nadrzędnego określonego DefaultValue w metadanych.

  • W przypadku CoerceValueCallbacknowa wartość zastąpi istniejącą wartość CoerceValueCallback. Jeśli nie określisz CoerceValueCallback w metadanych przesłonięcia, wartość pochodzi z najbliższego przodka w hierarchii dziedziczenia, który określił CoerceValueCallback.

  • W przypadku niedziedziczonych flag FrameworkPropertyMetadata, można zastąpić domyślną wartość false wartością true. Można jednak zastąpić tylko wartość true wartością false dla Inherits, Journal, OverridesInheritanceBehaviori SubPropertiesDoNotAffectRender.

Notatka

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

Zobacz też