Dziedziczenie 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ść tak, jak została ustawiona w najbliższym elemencie nadrzędnym. Element nadrzędny mógł również uzyskać swoją wartość poprzez dziedziczenie wartości właściwości, więc system potencjalnie rekursuje aż do korzenia 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, gdy zagnieżdżasz elementy w innych elementach podczas definiowania aplikacji przy użyciu 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 dotyczą właściwości, którą należy ustawiać tylko raz na stronę, ale która jest także członkiem jednej z elementarnych klas bazowych i dlatego występuje na większości elementów podrzędnych. Na przykład właściwość FlowDirection kontroluje, w jakim kierunku powinna być wyświetlana i rozmieszczana zawartość na stronie. Zazwyczaj dąży się do tego, aby koncepcja przepływu tekstu była spójnie stosowana we wszystkich elementach podrzędnych. Jeśli z jakiegoś powodu kierunek przepływu został zresetowany na pewnym poziomie drzewa elementów przez akcję użytkownika lub środowiska, zazwyczaj powinien zostać zresetowany na wszystkich poziomach. Gdy właściwość FlowDirection jest dziedziczona, wartość musi zostać ustawiona lub zresetowana tylko raz na poziomie drzewa elementów, który obejmuje potrzeby prezentacji każdej strony w aplikacji. Nawet wartość domyślna na początku zostanie odziedziczona 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 dziedziczonej właściwości niestandardowej
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 czynniki wpływające na wydajność. 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 Zarejestruj dołączoną właściwość. 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 dziedziczona. Mimo że właściwość została zarejestrowana jako dołączona, możesz również utworzyć właściwość "opakowanie" dla dostępu get/set dla typu właściciela, podobnie jak w przypadku właściwości zależności niezwiązanej. 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 DependencyObject.
Dołączone właściwości są koncepcyjnie podobne do właściwości globalnych; Możesz sprawdzić wartość dla dowolnego DependencyObject i uzyskać prawidłowy wynik. Typowy scenariusz dla dołączonych właściwości polega na ustawieniu wartości właściwości na 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.
Notatka
Mimo że dziedziczenie wartości właściwości może działać dla nieprzyłączonych właściwości zależnych, zachowanie dziedziczenia dla właściwości nieprzyłączonej przez niektóre granice elementów w drzewie czasu wykonywania jest niezdefiniowane. Zawsze używaj RegisterAttached do rejestrowania właściwości, które określasz jako Inherits w metadanych.
Dziedziczenie wartości właściwości przez granice drzewa
Dziedziczenie właściwości działa przez przechodzenie przez drzewo elementów. To drzewo jest często równoległe do drzewa logicznego. Jednak za każdym razem, gdy w znacznikach zostanie uwzględniony obiekt podstawowego poziomu WPF, który definiuje drzewo elementów, takie jak Brush, utworzone zostaje nieciągłe drzewo logiczne. Prawdziwe drzewo logiczne nie rozciąga się koncepcyjnie przez Brush, ponieważ drzewo logiczne jest koncepcją na poziomie platformy WPF. Widać to w wynikach przy użyciu metod LogicalTreeHelper. 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, tak długo jak właściwość dołączona została zarejestrowana i nie napotkano celowej blokady dziedziczenia (na przykład Frame).
Zobacz też
.NET Desktop feedback