Udostępnij za pośrednictwem


Metadane właściwości struktury (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 prezentacji i pliki wykonywalne wysyłają zapytania do FrameworkPropertyMetadata właściwości zależności.

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.

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 AffectsArrangeflagi , AffectsMeasurei AffectsRender metadanych. 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 zapewniają zachowanie specyficzne dla implementacji i renderowanie informacji do systemu układu. Gdy AffectsArrangewłaściwość , AffectsMeasurelub AffectsRender jest ustawiona na true wartość w metadanych właściwości zależności i jej obowiązujące zmiany wartości, system właściwości WPF zainicjuje żądanie unieważnienia wizualizacji elementu w celu wyzwolenia ponownego wyrysowania.

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

  • Metadane dziedziczenia wartości właściwości, w szczególności Inherits flagi metadanych i OverridesInheritanceBehavior . 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. Aby uzyskać więcej informacji, zobacz Dziedziczenie wartości właściwości.

    Uwaga

    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 właściwości zależności od elementów nadrzędnych.

  • Metadane powiązania danych, w szczególności BindsTwoWayByDefault flagi metadanych 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 ustawienia właściwości, które zgłaszają stan i można modyfikować przez akcję użytkownika, na przykład IsSelected. Należy również rozważyć ustawienie powiązania dwukierunkowego jako domyślnego, gdy użytkownicy kontrolki oczekują jej zaimplementowania, na przykład TextBox.Text. BindsTwoWayByDefault Dotyczy tylko domyślnego trybu powiązania. Aby edytować kierunek przepływu danych powiązania, ustaw wartość Binding.Mode. Możesz użyć IsNotDataBindable polecenia , aby wyłączyć powiązanie danych, gdy nie ma dla niego żadnego 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 Journal metadanych. Wartość domyślna flagi Journal dotyczy tylko true niektórych właściwości zależności, takich jak SelectedIndex. Kontrolki danych wejściowych użytkownika powinny ustawiać flagę Journal właściwości, których wartości przechowują wybory użytkowników, które muszą być przechowywane. Flaga Journal jest odczytywana przez aplikacje lub usługi, które obsługują dzienniki, w tym usługi dziennika WPF. Aby uzyskać informacje na temat przechowywania kroków nawigacji, zobacz Omówienie nawigacji.

FrameworkPropertyMetadata element pochodzi bezpośrednio z UIPropertyMetadataelementu i implementuje flagi omówione tutaj. Jeśli nie zostanie ustawiona specjalnie, FrameworkPropertyMetadata flagi mają wartość falsedomyślną .

Reading FrameworkPropertyMetadata

Aby pobrać metadane dla właściwości zależności, wywołaj GetMetadata identyfikator DependencyProperty . Wywołanie GetMetadata zwraca PropertyMetadata obiekt. Jeśli musisz wykonać zapytanie dotyczące wartości metadanych platformy rzutowania PropertyMetadata na FrameworkPropertyMetadatawartość .

Określanie elementu FrameworkPropertyMetadata

Podczas rejestrowania właściwości zależności możesz utworzyć i przypisać do niej metadane. Obiekt metadanych, który przypisujesz, może być PropertyMetadata lub jedną z jego klas pochodnych, takich jak FrameworkPropertyMetadata. Wybierz FrameworkPropertyMetadata właściwości zależności, które opierają się na interfejsach API prezentacji WPF i plikach wykonywalnych na potrzeby renderowania i powiązania danych. Bardziej zaawansowaną opcją jest utworzenie FrameworkPropertyMetadata niestandardowej klasy raportowania metadanych z większą pulą flag. Można też użyć UIPropertyMetadata właściwości innych niż struktury, które mają wpływ na renderowanie interfejsu użytkownika.

Mimo że opcje metadanych są zwykle ustawiane podczas rejestracji nowej właściwości zależności, można je ponownie określić w OverrideMetadata wywołaniach lub AddOwner . Podczas zastępowania metadanych zawsze przesłaniaj ten sam typ metadanych, który był używany podczas rejestracji właściwości.

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

  1. Ustaw flagi na wystąpieniu FrameworkPropertyMetadataOptions typu wyliczenia. FrameworkPropertyMetadataOptions umożliwia określenie flag metadanych w bitowej kombinacji OR. Następnie utwórz wystąpienie FrameworkPropertyMetadata przy użyciu konstruktora, który ma FrameworkPropertyMetadataOptions parametr i przekaż FrameworkPropertyMetadataOptions wystąpienie. Aby zmienić flagi metadanych po przekazaniu FrameworkPropertyMetadataOptions do konstruktora FrameworkPropertyMetadata , zmień odpowiednią właściwość w nowym FrameworkPropertyMetadata wystąpieniu. Jeśli na przykład ustawisz flagęFrameworkPropertyMetadataOptions.NotDataBindable, możesz ją cofnąć, ustawiając wartość FrameworkPropertyMetadata.IsNotDataBindable .false

  2. FrameworkPropertyMetadata Utwórz wystąpienie przy użyciu konstruktora, który nie ma parametruFrameworkPropertyMetadataOptions, a następnie ustaw odpowiednie Boolean flagi na .FrameworkPropertyMetadata Ustaw wartości flagi przed skojarzeniem FrameworkPropertyMetadata wystąpienia z właściwością zależności. W przeciwnym razie otrzymasz wartość InvalidOperationException.

Zachowanie zastępowania metadanych

Po zastąpieniu metadanych właściwości struktury zmieniono wartości metadanych zamień lub zostały scalone z oryginalnymi wartościami:

  • W przypadku elementu PropertyChangedCallbackdomyślna logika scalania zachowuje poprzednie 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. Dziedziczone wywołania zwrotne są uruchamiane tylko raz i są własnością klasy, która dodała je do metadanych.

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

  • 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 przodka w łańcuchu dziedziczenia, który określił CoerceValueCallbackelement .

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

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.

Zobacz też