Przegląd Elementy bazy
Wysoki odsetek klas w Windows Presentation Foundation (WPF) pochodzi z czterech klas, które są często określane w dokumentacji zestawu SDK jako klasy elementów podstawowych. Te klasy to UIElement, FrameworkElement, ContentElementi FrameworkContentElement. Klasa DependencyObject jest również powiązana, ponieważ jest wspólną klasą bazową obu UIElement klas i ContentElement
Podstawowe interfejsy API elementów w klasach WPF
Zarówno UIElement , jak i ContentElement pochodzą z DependencyObjectmetody , za pośrednictwem nieco różnych ścieżek. Podział na tym poziomie dotyczy sposobu użycia elementu UIElement lub ContentElement w interfejsie użytkownika i celu, do którego służy w aplikacji. UIElementMa Visual również w swojej hierarchii klas, która jest klasą, która uwidacznia obsługę grafiki niższego poziomu bazowej Windows Presentation Foundation (WPF). Visual Udostępnia strukturę renderowania przez zdefiniowanie niezależnych prostokątnych regionów ekranu. W praktyce w przypadku elementów, UIElement które będą obsługiwać większy model obiektów, są przeznaczone do renderowania i układu w regionach, które można opisać jako prostokątne regiony ekranu, a model zawartości jest celowo bardziej otwarty, aby umożliwić różne kombinacje elementów. ContentElementnie pochodzi z Visual; jego model polega na tym, że element ContentElement będzie używany przez coś innego, takiego jak czytelnik lub osoba przeglądająca, które następnie interpretują elementy i tworzą pełne Visual dane do Windows Presentation Foundation (WPF) do użytku. Niektóre UIElement klasy są przeznaczone do hostów zawartości: zapewniają hosting i renderowanie dla co najmniej jednej ContentElement klasy (DocumentViewer jest przykładem takiej klasy). ContentElement jest używana jako klasa bazowa dla elementów z nieco mniejszymi modelami obiektów i tym bardziej adresuje tekst, informacje lub zawartość dokumentu, która może być hostowana w obiekcie UIElement.
Framework-Level i Core-Level
UIElement służy jako klasa bazowa dla FrameworkElement, i ContentElement służy jako klasa bazowa dla klasy FrameworkContentElement. Powodem następnego poziomu klas jest obsługa podstawowego poziomu WPF, który jest oddzielony od poziomu struktury WPF, a ten podział istnieje również w jaki sposób interfejsy API są podzielone między zestawy PresentationCore i PresentationFramework. Poziom struktury WPF przedstawia bardziej kompletne rozwiązanie dla podstawowych potrzeb aplikacji, w tym implementację menedżera układów do prezentacji. Poziom rdzeniA WPF umożliwia korzystanie z dużej części WPF bez przejmowania narzutu dodatkowego zestawu. Rozróżnienie między tymi poziomami bardzo rzadko ma znaczenie dla większości typowych scenariuszy tworzenia aplikacji, a ogólnie rzecz biorąc, należy traktować interfejsy API WPF jako całość i nie martwić się różnicą między poziomem struktury WPF i poziomem rdzeniA WPF. Może być konieczne poznanie różnic na poziomie, jeśli projekt aplikacji zdecyduje się zastąpić znaczne ilości funkcji na poziomie platformy WPF, na przykład jeśli ogólne rozwiązanie ma już własne implementacje kompozycji i układu interfejsu użytkownika.
Wybieranie elementu, z którego ma pochodzić
Najbardziej praktycznym sposobem utworzenia niestandardowej klasy rozszerzającej WPF jest wyprowadzenie z jednej z klas WPF, w której uzyskasz jak najwięcej żądanej funkcjonalności za pośrednictwem istniejącej hierarchii klas. W tej sekcji wymieniono funkcje, które są dostarczane z trzema najważniejszymi klasami elementów, które ułatwiają podjęcie decyzji, z której klasy mają być dziedziczone.
Jeśli implementujesz kontrolkę, która jest naprawdę jedną z bardziej typowych przyczyn wyprowadzania z klasy WPF, prawdopodobnie chcesz pochodzić z klasy, która jest praktyczną kontrolką, klasą bazową rodziny kontrolek lub przynajmniej z klasy bazowej Control . Aby uzyskać wskazówki i praktyczne przykłady, zobacz Omówienie tworzenia kontrolek.
Jeśli nie tworzysz kontrolki i musisz pochodzić z klasy, która jest wyższa w hierarchii, poniższe sekcje są przeznaczone jako przewodnik dla cech zdefiniowanych w każdej klasie elementu podstawowego.
Jeśli tworzysz klasę pochodzącą z DependencyObjectklasy , dziedziczysz następujące funkcje:
GetValue obsługa i SetValue obsługa systemu właściwości ogólnych.
Możliwość używania właściwości zależności i dołączonych właściwości, które są implementowane jako właściwości zależności.
Jeśli tworzysz klasę, która pochodzi z UIElementklasy , dziedziczysz następujące funkcje oprócz tej udostępnionej przez DependencyObjectprogram :
Podstawowa obsługa animowanych wartości właściwości. Aby uzyskać więcej informacji, zobacz Omówienie animacji.
Podstawowa obsługa zdarzeń wejściowych i obsługa poleceń. Aby uzyskać więcej informacji, zobacz Omówienie danych wejściowych i Omówienie poleceń.
Metody wirtualne, które można przesłonić w celu udostępnienia informacji systemowi układu.
Jeśli tworzysz klasę, która pochodzi z FrameworkElementklasy , dziedziczysz następujące funkcje oprócz tej udostępnionej przez UIElementprogram :
Obsługa stylów i scenorysów. Aby uzyskać więcej informacji, zobacz Stylei Storyboards Overview (Omówienie scenorysów).
Obsługa powiązania danych. Aby uzyskać więcej informacji, zobacz Omówienie powiązania danych.
Obsługa odwołań do zasobów dynamicznych. Aby uzyskać więcej informacji, zobacz Zasoby XAML.
Obsługa dziedziczenia wartości właściwości i inne flagi w metadanych, które pomagają zgłaszać warunki dotyczące właściwości usług struktury, takich jak powiązanie danych, style lub implementacja struktury układu. Aby uzyskać więcej informacji, zobacz Metadane właściwości struktury.
Koncepcja drzewa logicznego. Aby uzyskać więcej informacji, zobacz Drzewa w WPF.
Obsługa praktycznej implementacji systemu układu na poziomie struktury WPF, w tym OnPropertyChanged zastąpienia, które mogą wykrywać zmiany właściwości mających wpływ na układ.
Jeśli tworzysz klasę, która pochodzi z ContentElementklasy , dziedziczysz następujące funkcje oprócz tej udostępnionej przez DependencyObjectprogram :
Obsługa animacji. Aby uzyskać więcej informacji, zobacz Omówienie animacji.
Podstawowa obsługa zdarzeń wejściowych i obsługa poleceń. Aby uzyskać więcej informacji, zobacz Omówienie danych wejściowych i Omówienie poleceń.
Jeśli tworzysz klasę pochodzącą z FrameworkContentElementklasy , oprócz tej klasy dostarczanej przez ContentElementprogram uzyskasz następujące funkcje:
Obsługa stylów i scenorysów. Aby uzyskać więcej informacji, zobacz Stylei Animacja — omówienie.
Obsługa powiązania danych. Aby uzyskać więcej informacji, zobacz Omówienie powiązania danych.
Obsługa odwołań do zasobów dynamicznych. Aby uzyskać więcej informacji, zobacz Zasoby XAML.
Obsługa dziedziczenia wartości właściwości i inne flagi w metadanych, które ułatwiają zgłaszanie warunków dotyczących właściwości usług struktury, takich jak powiązanie danych, style lub implementacja układu struktury. Aby uzyskać więcej informacji, zobacz Metadane właściwości struktury.
Nie dziedziczysz dostępu do modyfikacji systemu układu (takich jak ArrangeOverride). Implementacje systemu układu są dostępne tylko w systemie FrameworkElement. Jednak dziedziczysz OnPropertyChanged przesłonięcia, które mogą wykrywać zmiany właściwości wpływające na układ i raportować je do dowolnych hostów zawartości.
Modele zawartości są udokumentowane dla różnych klas. Model zawartości dla klasy jest jednym z możliwych czynników, które należy wziąć pod uwagę, jeśli chcesz znaleźć odpowiednią klasę do uzyskania. Aby uzyskać więcej informacji, zobacz Model zawartości WPF.
Inne klasy bazowe
Dispatcherobject
DispatcherObject Zapewnia obsługę modelu wątkowania WPF i umożliwia skojarzenie wszystkich obiektów utworzonych dla aplikacji WPF z elementem Dispatcher. Nawet jeśli nie pochodzisz z UIElement, DependencyObjectlub Visual, należy rozważyć wyprowadzenie z DispatcherObject w celu uzyskania obsługi tego modelu wątkowania. Aby uzyskać więcej informacji, zobacz Model wątkowania.
Visual
Visual Implementuje koncepcję obiektu 2D, który zwykle wymaga prezentacji wizualnej w mniej więcej prostokątnym regionie. Rzeczywiste renderowanie elementu Visual odbywa się w innych klasach (nie jest samodzielne), ale Visual klasa udostępnia znany typ, który jest używany przez procesy renderowania na różnych poziomach. Visual implementuje testowanie trafień, ale nie ujawnia zdarzeń zgłaszających wyniki testów trafień (znajdują się one w UIElementpliku ). Aby uzyskać więcej informacji, zobacz Visual Layer Programming (Programowanie w warstwie wizualnej).
Freezable
Freezable symuluje niezmienność w obiekcie modyfikowalnym, zapewniając metodę generowania kopii obiektu, gdy obiekt niezmienny jest wymagany lub pożądany ze względu na wydajność. Typ Freezable zapewnia wspólną podstawę dla niektórych elementów graficznych, takich jak geometrie i pędzle, a także animacje. W szczególności element nie jest obiektem FreezableVisual; może zawierać właściwości, które stają się podwłaściwościami, gdy Freezable obiekt jest stosowany w celu wypełnienia wartości właściwości innego obiektu, a te podwłaściwości mogą mieć wpływ na renderowanie. Aby uzyskać więcej informacji, zobacz Omówienie obiektów z możliwością zamrażania.
Animatable jest klasą pochodną Freezable , która w szczególności dodaje warstwę kontrolki animacji i niektóre elementy członkowskie narzędzia, dzięki czemu obecnie animowane właściwości można odróżnić od nieanimowanych właściwości.
Kontrola
Control jest przeznaczoną klasą bazową dla typu obiektu, który jest inaczej określany jako kontrolka lub składnik, w zależności od technologii. Ogólnie rzecz biorąc, klasy kontrolek WPF to klasy, które bezpośrednio reprezentują kontrolkę interfejsu użytkownika lub ściśle uczestniczą w kompozycji kontrolnej. Podstawową funkcją, która Control umożliwia, jest tworzenie szablonów sterujących.