Metadane właściwości struktury
Opcje metadanych właściwości platformy są zgłaszane dla właściwości obiektów, które są uważane za należące do poziomu platformy WPF w architekturze Windows Presentation Foundation (WPF). Ogólnie rzecz biorąc, oznaczenie na poziomie struktury WPF wiąże się z tym, że funkcje takie jak renderowanie, powiązanie danych i uściślenia systemu właściwości są obsługiwane przez interfejsy API prezentacji WPF i pliki wykonywalne. Metadane właściwości struktury są odpytywane przez te systemy w celu określenia cech specyficznych dla poszczególnych właściwości elementu.
Warunki wstępne
W tym temacie założono, że znasz właściwości zależności z perspektywy konsumenta istniejących właściwości zależności w klasach Windows Presentation Foundation (WPF) i przeczytałeś Właściwości zależności — omówienie. Należy również przeczytać metadane właściwości zależności .
Co jest przekazywane przez metadane właściwości struktury
Metadane właściwości struktury można podzielić na następujące kategorie:
Właściwości układu raportowania, które mają wpływ na element (AffectsArrange, AffectsMeasure, AffectsRender). Te flagi można ustawić w metadanych, jeśli właściwość ma wpływ na te odpowiednie aspekty, a także implementujesz metody MeasureOverride / ArrangeOverride w klasie, aby dostarczyć konkretne zachowanie renderowania i informacje do systemu układu. Zazwyczaj taka implementacja sprawdzałaby nieprawidłowe właściwości we właściwościach zależności, w których każda z tych właściwości układu była prawdziwa w metadanych właściwości, a tylko te unieważnienia wymagały żądania nowego przekazania układu.
Właściwości układu raportowania, które mają wpływ na element nadrzędny elementu (AffectsParentArrange, AffectsParentMeasure). Niektóre przykłady, w których te flagi są domyślnie ustawione, to FixedPage.Left i Paragraph.KeepWithNext.
Inherits. Domyślnie właściwości zależności nie dziedziczą wartości. OverridesInheritanceBehavior umożliwia również przechodzenie ścieżki dziedziczenia do drzewa wizualnego, co jest niezbędne w przypadku niektórych scenariuszy tworzenia kontrolek.
Notatka
termin "dziedziczy" w kontekście wartości właściwości ma szczególne znaczenie dla właściwości zależnych; oznacza to, że elementy podrzędne mogą dziedziczyć rzeczywistą wartość właściwości zależnych od elementów nadrzędnych dzięki możliwościom systemu właściwości na poziomie frameworku WPF. Nie ma to nic wspólnego bezpośrednio z typem kodu zarządzanego i dziedziczeniem składowych za pośrednictwem typów pochodnych. Aby uzyskać szczegółowe informacje, zapoznaj się z , dziedziczenie wartości właściwości,.
Charakterystyki powiązania danych raportowych (IsNotDataBindable, BindsTwoWayByDefault). Domyślnie właściwości zależności w strukturze obsługują powiązanie danych z zachowaniem powiązania jednokierunkowego. Powiązanie danych można wyłączyć, jeśli nie było żadnego scenariusza (ponieważ mają one być elastyczne i rozszerzalne, nie ma wielu przykładów takich właściwości w domyślnych interfejsach API WPF). Ustawienie powiązania może mieć dwukierunkową wartość domyślną dla właściwości, które łączą zachowanie kontrolki między elementami składników (IsSubmenuOpen jest przykładem) lub gdzie powiązanie dwukierunkowe jest typowym i oczekiwanym scenariuszem dla użytkowników (Text jest przykładem). Zmiana metadanych dotyczących powiązania danych wpływa tylko na wartość domyślną; w przypadku pojedynczego powiązania domyślne ustawienie można zawsze zmienić. Aby uzyskać szczegółowe informacje na temat trybów powiązań i powiązań w ogóle, zobacz Omówienie powiązania danych.
Raportowanie, czy właściwości powinny być dziennikowane przez aplikacje lub usługi obsługujące dzienniki (Journal). W przypadku elementów ogólnych dziennik nie jest domyślnie włączony, ale jest on selektywnie włączony dla niektórych kontrolek danych wejściowych użytkownika. Ta właściwość ma być odczytywana przez usługi dziennikowania, w tym implementację dziennika WPF, i jest zwykle ustawiana na kontrolkach interfejsu użytkownika, takich jak wybory użytkowników na listach, które powinny być utrwalane pomiędzy krokami nawigacji. Aby uzyskać informacje na temat dziennika, zobacz Navigation Overview.
Reading FrameworkPropertyMetadata
Każda z właściwości połączonych powyżej to konkretne właściwości, które FrameworkPropertyMetadata dodaje do bezpośredniej klasy bazowej UIPropertyMetadata. Każda z tych właściwości będzie domyślnie false
. Żądanie metadanych dla właściwości, w której znajomość wartości tych właściwości jest ważna, powinna podjąć próbę rzutowania zwróconych metadanych na FrameworkPropertyMetadata, a następnie sprawdzić wartości poszczególnych właściwości zgodnie z potrzebami.
Określanie metadanych
Podczas tworzenia nowego wystąpienia metadanych do celów stosowania metadanych do nowej rejestracji właściwości zależności można wybrać klasę metadanych do użycia: PropertyMetadata podstawową lub inną klasę pochodną, taką jak FrameworkPropertyMetadata. Ogólnie rzecz biorąc, należy użyć FrameworkPropertyMetadata, szczególnie jeśli właściwość ma jakąkolwiek interakcję z systemem właściwości i funkcjami WPF, takimi jak układ i powiązanie danych. Inną opcją dla bardziej zaawansowanych scenariuszy jest utworzenie własnej klasy raportowania metadanych przez dziedziczenie z FrameworkPropertyMetadata, z dodatkowymi informacjami zawartymi w jej składowych. Możesz też użyć PropertyMetadata lub UIPropertyMetadata, aby przekazać stopień obsługi funkcji implementacji.
W przypadku istniejących właściwości (wywołanieAddOwner lub OverrideMetadata) należy zawsze zastępować je typem metadanych używanym w oryginalnej rejestracji.
Jeśli tworzysz wystąpienie FrameworkPropertyMetadata, istnieją dwa sposoby wypełniania tych metadanych wartościami dla określonych właściwości komunikujących właściwości struktury:
Użyj sygnatury konstruktora FrameworkPropertyMetadata, który zezwala na parametr
flags
. Ten parametr powinien być wypełniony wszystkimi żądanymi połączonymi wartościami flag wyliczania FrameworkPropertyMetadataOptions.Użyj jednego z podpisów bez parametru
flags
, a następnie ustaw każdą właściwość logiczną raportowania na FrameworkPropertyMetadata, abytrue
dla każdej żądanej zmiany cech. Jeśli to zrobisz, należy ustawić te właściwości przed skonstruowaniem wszystkich elementów z tą właściwością zależności; Właściwości logiczne są odczytywane i zapisywane w celu umożliwienia tego zachowania, aby uniknąć parametruflags
i nadal wypełniać metadane, ale metadane muszą zostać skutecznie zapieczętowane przed użyciem właściwości. W związku z tym próba ustawienia właściwości po zażądaniu metadanych będzie nieprawidłową operacją.
Zachowanie scalania metadanych właściwości frameworku
Po zastąpieniu metadanych właściwości struktury różne charakterystyki metadanych są scalane lub zastępowane.
PropertyChangedCallback jest scalona. Jeśli dodasz nowy PropertyChangedCallback, wywołanie zwrotne jest przechowywane w metadanych. Jeśli nie określisz PropertyChangedCallback w nadpisaniu, wartość PropertyChangedCallback zostanie użyta jako odwołanie z najbliższego obiektu nadrzędnego, który określił ją w metadanych.
Rzeczywiste działanie systemu właściwości dla PropertyChangedCallback polega na tym, że implementacje dla wszystkich właścicieli metadanych w hierarchii są zachowywane i dodawane do tabeli. System właściwości wykonuje najpierw wywołania zwrotne klasy najbardziej odległej w hierarchii. Dziedziczone wywołania zwrotne są uruchamiane tylko raz, licząc jako należące do klasy, która umieściła je w metadanych.
DefaultValue jest zastępowany. Jeśli nie określisz PropertyChangedCallback w przesłonięciu, wartość DefaultValue pochodzi z najbliższego przodka, który podał ją w metadanych.
CoerceValueCallback implementacje są zastępowane. Jeśli dodasz nowy CoerceValueCallback, wywołanie zwrotne jest przechowywane w metadanych. Jeśli nie określisz CoerceValueCallback w nadpisaniu, wartość CoerceValueCallback zostanie uzyskana jako odniesienie z najbliższego nadrzędnego elementu, który określił je w metadanych.
Zachowanie systemu właściwości polega na tym, że tylko CoerceValueCallback jest wywoływane w bezpośrednich metadanych. Nie są zachowywane odwołania do innych implementacji CoerceValueCallback w hierarchii.
Flagi wyliczenia FrameworkPropertyMetadataOptions są łączone jako bitowa operacja OR. Jeśli określisz FrameworkPropertyMetadataOptions, oryginalne opcje nie zostaną zastąpione. Aby zmienić opcję, ustaw odpowiednią właściwość na FrameworkPropertyMetadata. Jeśli na przykład oryginalny obiekt FrameworkPropertyMetadata ustawia flagę FrameworkPropertyMetadataOptions.NotDataBindable, możesz to zmienić, ustawiając FrameworkPropertyMetadata.IsNotDataBindable na
false
.
To zachowanie jest implementowane przez Mergei można je zastąpić na pochodnych klasach metadanych.
Zobacz też
.NET Desktop feedback