Metadane właściwości szablonu
Opcje metadanych właściwości struktury są zgłaszane dla właściwości elementów obiektów uważanych za na poziomie struktury 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.
Wymagania wstępne
W tym temacie założono, że rozumiesz 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 zapoznasz się z omówieniem właściwości zależności. 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 wdrażasz MeasureOverride / ArrangeOverride metody 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 wpływają 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.
Uwaga
Termin "dziedziczy" w kontekście wartości właściwości oznacza coś specyficznego dla właściwości zależności; Oznacza to, że elementy podrzędne mogą dziedziczyć rzeczywistą wartość właściwości zależności od elementów nadrzędnych z powodu możliwości na poziomie struktury WPF systemu właściwości 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, zobacz Dziedziczenie wartości właściwości.
Właściwości powiązania danych raportowania (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ą zachowania 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 powiązanych z powiązaniem danych ma wpływ tylko na wartość domyślną; w zależności od tego, czy ustawienie domyślne zawsze można 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, które obsługują 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 rejestrowania, w tym implementację dziennika WPF, i jest zwykle ustawiana na kontrolkach użytkownika, takich jak wybory użytkowników na listach, które powinny być utrwalane w krokach nawigacji. Aby uzyskać informacje na temat dziennika, zobacz Omówienie nawigacji.
Reading FrameworkPropertyMetadata
Każda z właściwości połączonych powyżej to konkretne właściwości, które FrameworkPropertyMetadata dodaje do swojej natychmiastowej klasy UIPropertyMetadatabazowej . Każda z tych właściwości będzie false
domyślnie. Żą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: podstawową PropertyMetadata lub inną klasę pochodną, taką jak FrameworkPropertyMetadata. Ogólnie rzecz biorąc, należy użyć funkcji 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ą bardziej zaawansowanych scenariuszy jest utworzenie FrameworkPropertyMetadata własnej klasy raportowania metadanych z dodatkowymi informacjami przenoszonymi w jego składowych. Możesz też użyć PropertyMetadata funkcji lub UIPropertyMetadata przekazać stopień obsługi funkcji implementacji.
W przypadku istniejących właściwości (AddOwner lub OverrideMetadata wywołania) należy zawsze zastąpić typ metadanych używany przez oryginalną rejestrację.
Jeśli tworzysz FrameworkPropertyMetadata wystąpienie, istnieją dwa sposoby wypełniania tych metadanych wartościami dla określonych właściwości, które komunikują cechy właściwości struktury:
Użyj podpisu konstruktora FrameworkPropertyMetadata , który zezwala na
flags
parametr. Ten parametr powinien być wypełniony wszystkimi żądanymi połączonymi wartościami FrameworkPropertyMetadataOptions flag wyliczenia.Użyj jednego z podpisów bez parametru
flags
, a następnie ustaw dla każdej właściwości logicznej raportowania wartość FrameworkPropertyMetadata natrue
dla każdej żądanej zmiany charakterystyki. 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 struktury
Po zastąpieniu metadanych właściwości struktury różne właściwości metadanych są scalane lub zastępowane.
PropertyChangedCallback jest scalony. Jeśli dodasz nowy PropertyChangedCallbackelement , wywołanie zwrotne jest przechowywane w metadanych. Jeśli nie określisz PropertyChangedCallback wartości w przesłonięć, wartość PropertyChangedCallback jest promowana jako odwołanie z najbliższego obiektu nadrzędnego, który określił go w metadanych.
Rzeczywiste zachowanie systemu właściwości jest PropertyChangedCallback takie, że implementacje dla wszystkich właścicieli metadanych w hierarchii są zachowywane i dodawane do tabeli, z kolejnością wykonywania przez system właściwości jest to, że wywołania zwrotne najbardziej głęboko pochodnej klasy są wywoływane jako pierwsze. Dziedziczone wywołania zwrotne są uruchamiane tylko raz, licząc jako należące do klasy, która umieściła je w metadanych.
DefaultValue element jest zastępowany. Jeśli nie określisz PropertyChangedCallback wartości w przesłonięć, wartość DefaultValue pochodzi z najbliższego obiektu nadrzędnego, który określił go w metadanych.
CoerceValueCallback implementacje są zastępowane. Jeśli dodasz nowy CoerceValueCallbackelement , wywołanie zwrotne jest przechowywane w metadanych. Jeśli nie określisz CoerceValueCallback wartości w przesłonięć, wartość CoerceValueCallback jest promowana jako odwołanie z najbliższego obiektu nadrzędnego, który określił go w metadanych.
Zachowanie systemu właściwości polega na tym, że wywoływane są tylko CoerceValueCallback metadane bezpośrednie. Nie są zachowywane żadne odwołania do innych CoerceValueCallback implementacji w hierarchii.
Flagi FrameworkPropertyMetadataOptions wyliczenia są łączone jako bitowa operacja OR. Jeśli określisz FrameworkPropertyMetadataOptionswartość , oryginalne opcje nie zostaną zastąpione. Aby zmienić opcję, ustaw odpowiednią właściwość na .FrameworkPropertyMetadata Jeśli na przykład oryginalny FrameworkPropertyMetadata obiekt ustawia flagę FrameworkPropertyMetadataOptions.NotDataBindable , możesz ją zmienić, ustawiając wartość FrameworkPropertyMetadata.IsNotDataBindable
false
.
To zachowanie jest implementowane przez Mergeprogram i może zostać zastąpione w klasach pochodnych metadanych.
Zobacz też
.NET Desktop feedback