Przejęcie wartości właściwości

Dziedziczenie wartości właściwości jest funkcją systemu właściwości Windows Presentation Foundation (WPF). Dziedziczenie wartości właściwości umożliwia elementom podrzędnym w drzewie elementów uzyskanie wartości określonej właściwości z elementów nadrzędnych, dziedzicząc tę wartość w dowolnym miejscu w najbliższym elemenie nadrzędnym. Element nadrzędny mógł również uzyskać swoją wartość za pośrednictwem dziedziczenia wartości właściwości, więc system potencjalnie rekursuje przez cały sposób do katalogu głównego strony. Dziedziczenie wartości właściwości nie jest domyślnym zachowaniem systemu właściwości; Właściwość musi zostać ustanowiona przy użyciu określonego ustawienia metadanych w celu zainicjowania dziedziczenia wartości właściwości na elementach podrzędnych.

Dziedziczenie wartości właściwości jest dziedziczeniem zawierania

"Dziedziczenie" jako termin tutaj nie jest zupełnie takie samo, jak dziedziczenie w kontekście typów i ogólnego programowania obiektowego, gdzie klasy pochodne dziedziczą definicje składowych z ich klas bazowych. To znaczenie dziedziczenia jest również aktywne w WPF: właściwości zdefiniowane w różnych klasach bazowych są widoczne jako atrybuty dla pochodnych klas XAML, gdy są używane jako elementy, i uwidocznione jako składowe dla kodu. Dziedziczenie wartości właściwości dotyczy szczególnie tego, jak wartości właściwości mogą dziedziczyć z jednego elementu do drugiego na podstawie relacji nadrzędny-podrzędny w drzewie elementów. To drzewo elementów jest najbardziej widoczne bezpośrednio podczas zagnieżdżania elementów wewnątrz innych elementów podczas definiowania aplikacji w znaczników XAML. Drzewa obiektów można również tworzyć programowo, dodając obiekty do wyznaczonych kolekcji innych obiektów, a dziedziczenie wartości właściwości działa tak samo w gotowym drzewie w czasie wykonywania.

Praktyczne zastosowania dziedziczenia wartości właściwości

Interfejsy API WPF zawierają kilka właściwości, które mają włączone dziedziczenie właściwości. Zazwyczaj scenariuszem jest to, że są one związane z właściwością, w której jest właściwe, aby właściwość była ustawiana tylko raz na stronę, ale gdzie ta właściwość jest również elementem członkowskim jednej z klas elementów podstawowych, a tym samym istniałaby również na większości elementów podrzędnych. Na przykład właściwość kontroluje kierunek FlowDirection przepływu zawartości i powinien być rozmieszczony na stronie. Zwykle koncepcja przepływu tekstu ma być spójnie obsługiwana we wszystkich elementach podrzędnych. Jeśli kierunek przepływu był z jakiegoś powodu resetowany na pewnym poziomie drzewa elementów według akcji użytkownika lub środowiska, zazwyczaj powinno być resetowane przez cały czas. Po dziedziczeniu FlowDirection właściwości należy ustawić lub zresetować wartość tylko raz na poziomie drzewa elementów, który obejmuje potrzeby prezentacji każdej strony w aplikacji. Nawet początkowa wartość domyślna będzie dziedziczyć w ten sposób. Model dziedziczenia wartości właściwości nadal umożliwia poszczególnym elementom resetowanie wartości w rzadkich przypadkach, w których celowe jest połączenie kierunków przepływu.

Tworzenie właściwości niestandardowej dziedziczonej

Zmieniając metadane właściwości niestandardowej, można również ustawić własne właściwości niestandardowe, które można dziedziczyć. Należy jednak pamiętać, że wyznaczenie właściwości jako dziedziczonej ma pewne zagadnienia dotyczące wydajności. W przypadkach, gdy ta właściwość nie ma ustalonej wartości lokalnej lub wartości uzyskanej za pośrednictwem stylów, szablonów lub powiązania danych, właściwość dziedziczona udostępnia przypisane wartości właściwości do wszystkich elementów podrzędnych w drzewie logicznym.

Aby właściwość brała udział w dziedziczeniu wartości, utwórz niestandardową właściwość dołączoną zgodnie z opisem w temacie Rejestrowanie dołączonej właściwości. Zarejestruj właściwość za pomocą metadanych (FrameworkPropertyMetadata) i określ opcję "Dziedziczy" w ustawieniach opcji w ramach tych metadanych. Upewnij się również, że właściwość ma ustanowioną wartość domyślną, ponieważ ta wartość będzie teraz dziedziczyć. Mimo że właściwość została zarejestrowana jako dołączona, możesz również utworzyć właściwość "otoka" dla dostępu get/set dla typu właściciela, podobnie jak w przypadku właściwości zależności "nieprzyłączone". Po wykonaniu tej czynności właściwość dziedziczona może zostać ustawiona przy użyciu otoki właściwości bezpośredniej dla typu właściciela lub typów pochodnych albo można ją ustawić przy użyciu dołączonej składni właściwości w dowolnym DependencyObjectobiekcie .

Dołączone właściwości są koncepcyjnie podobne do właściwości globalnych; Możesz sprawdzić wartość na dowolnym DependencyObject obiekcie i uzyskać prawidłowy wynik. Typowy scenariusz dla dołączonych właściwości polega na ustawieniu wartości właściwości w elementach podrzędnych, a ten scenariusz jest bardziej skuteczny, jeśli właściwość, o którą mowa, jest dołączoną właściwością, która jest zawsze niejawnie obecna jako dołączona właściwość dla każdego elementu (DependencyObject) w drzewie.

Uwaga

Mimo że dziedziczenie wartości właściwości może działać dla nieprzyłączone właściwości zależności, zachowanie dziedziczenia dla właściwości nieprzyłączonej przez niektóre granice elementów w drzewie czasu wykonywania jest niezdefiniowane. Zawsze służy RegisterAttached do rejestrowania właściwości, które są określone Inherits w metadanych.

Dziedziczenie wartości właściwości w granicach drzewa

Dziedziczenie właściwości działa przez przechodzenie drzewa elementów. To drzewo jest często równoległe do drzewa logicznego. Jednak za każdym razem, gdy do znaczników zostanie uwzględniny obiekt na poziomie rdzenia WPF, który definiuje drzewo elementów, takie jak Brush, utworzono nieciągłe drzewo logiczne. Prawdziwe drzewo logiczne nie rozciąga się koncepcyjnie przez Brushelement , ponieważ drzewo logiczne jest koncepcją na poziomie platformy WPF. Te informacje są widoczne w wynikach LogicalTreeHelperprzy użyciu metod . Jednak dziedziczenie wartości właściwości może wypełnić tę lukę w drzewie logicznym i nadal może przekazywać dziedziczone wartości przez, tak długo, jak właściwość dziedziczona została zarejestrowana jako dołączona właściwość i nie napotkano celowej granicy blokującej dziedziczenie (na przykład Frame).

Zobacz też