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
iArrangeOverride
dostarczają systemowi układu informacji o zachowaniu specyficznym dla implementacji i o sposobie renderowania. GdyAffectsArrange
,AffectsMeasure
lubAffectsRender
są ustawione natrue
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
jesttrue
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. FlagaJournal
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:
Ustaw flagi na wystąpieniu typu wyliczenia FrameworkPropertyMetadataOptions.
FrameworkPropertyMetadataOptions
pozwala określić flagi metadanych w bitowej kombinacji OR. Następnie zainicjuj wystąpienieFrameworkPropertyMetadata
za pomocą konstruktora z parametremFrameworkPropertyMetadataOptions
i przekaż wystąpienieFrameworkPropertyMetadataOptions
. Aby zmienić flagi metadanych po przekazaniuFrameworkPropertyMetadataOptions
do konstruktora FrameworkPropertyMetadata, należy zmienić odpowiednią właściwość w nowym wystąpieniuFrameworkPropertyMetadata
. Jeśli na przykład ustawisz flagę FrameworkPropertyMetadataOptions.NotDataBindable, możesz ją cofnąć, ustawiając FrameworkPropertyMetadata.IsNotDataBindable nafalse
.Utwórz wystąpienie
FrameworkPropertyMetadata
, używając konstruktora bez parametruFrameworkPropertyMetadataOptions
, a następnie ustaw odpowiednie flagi Boolean dlaFrameworkPropertyMetadata
. Ustaw wartości flagi przed skojarzeniem wystąpieniaFrameworkPropertyMetadata
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ślonegoDefaultValue
w metadanych.W przypadku CoerceValueCallbacknowa wartość zastąpi istniejącą wartość
CoerceValueCallback
. Jeśli nie określiszCoerceValueCallback
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ż
.NET Desktop feedback