Udostępnij za pośrednictwem


Omówienie elementów podstawowych

Wysoki odsetek klas w programie 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 to wspólna klasa bazowa zarówno UIElement, jak i ContentElement

Podstawowe interfejsy API elementów w klasach WPF

Zarówno UIElement, jak i ContentElement pochodzą z DependencyObject, przez nieco różne ścieżki. Podział na tym poziomie dotyczy sposobu, w jaki UIElement lub ContentElement są używane w interfejsie użytkownika i jaki cel pełnią w aplikacji. UIElement ma również Visual w hierarchii klas, która uwidacznia niższopoziomową obsługę grafiki wspierającą Windows Presentation Foundation (WPF). Visual zapewnia strukturę renderowania przez zdefiniowanie niezależnych prostokątnych regionów ekranu. W praktyce UIElement dotyczy elementów, które będą obsługiwać większy model obiektów, mają na celu renderowanie i układ 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. ContentElement nie pochodzi z Visual; jego model polega na tym, że ContentElement będą używane przez coś innego, takiego jak czytelnik lub osoba przeglądająca, które następnie zinterpretują elementy i tworzą kompletne Visual dla programu Windows Presentation Foundation (WPF) do użytku. Niektóre klasy UIElement mają być hostami zawartości: zapewniają hosting i renderowanie dla co najmniej jednej klasy ContentElement (DocumentViewer jest przykładem takiej klasy). ContentElement jest używana jako klasa bazowa dla elementów z nieco mniejszymi modelami obiektów, które bardziej zajmują się tekstem, informacjami lub zawartością dokumentów, które mogą być hostowane w UIElement.

Framework-Level i Core-Level

UIElement służy jako klasa bazowa dla FrameworkElement, a ContentElement służy jako klasa bazowa dla FrameworkContentElement. Powodem stworzenia tego kolejnego poziomu klas jest wsparcie rdzenia WPF, który jest oddzielony od poziomu frameworka WPF, co znajduje odzwierciedlenie również w tym, jak 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 na potrzeby prezentacji. Poziom rdzenia WPF umożliwia korzystanie z dużej części WPF bez obciążenia dodatkowym zestawem. Rozróżnienie między tymi poziomami bardzo rzadko ma znaczenie dla większości typowych scenariuszy tworzenia aplikacji, a ogólnie należy traktować interfejsy API WPF jako całość, a nie martwić się różnicą między poziomem struktury WPF i podstawowym poziomem 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 klasy niestandardowej, która rozszerza WPF, jest wyprowadzenie z jednej z klas WPF, w której uzyskasz jak najwięcej żądanych funkcji za pośrednictwem istniejącej hierarchii klas. W tej sekcji wymieniono funkcje, które są dostarczane z trzech najważniejszych klas elementów, co ułatwia podjęcie decyzji, którą klasę dziedziczyć.

Jeśli implementujesz kontrolkę, co zazwyczaj jest jedną z typowych przyczyn wywodzenia się z klasy WPF, prawdopodobnie chcesz wywodzić się 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 kontrolerów.

Jeśli nie tworzysz kontrolki i musisz pochodzić z klasy wyższej w hierarchii, poniższe sekcje są przeznaczone jako przewodnik dla cech zdefiniowanych w każdej klasie elementów podstawowych.

Jeśli tworzysz klasę pochodzącą z DependencyObject, dziedziczysz następujące funkcje:

  • wsparcie GetValue i SetValue oraz ogólne wsparcie systemu właściwości.

  • Możliwość używania właściwości zależnych i właściwości dołączonych, które są implementowane jako właściwości zależne.

Jeśli tworzysz klasę, która pochodzi z UIElement, dziedziczysz następujące funkcje oprócz tej udostępnionej przez DependencyObject:

  • 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 Input Overview and Commanding Overview (Omówienie wprowadzania danych wejściowych ) i Commanding Overview (Omówienie poleceń ).

  • Metody wirtualne, które można zastąpić w celu udostępnienia informacji systemowi układu.

Jeśli tworzysz klasę, która pochodzi z FrameworkElement, dziedziczysz następujące funkcje oprócz tej udostępnionej przez UIElement:

  • Obsługa stylów i scenorysów. Aby uzyskać więcej informacji, zobacz Style i Storyboards Overview.

  • Obsługa powiązania danych. Aby uzyskać więcej informacji, zobacz Przegląd powiązania danych .

  • Obsługa odwołań do zasobów dynamicznych. Więcej informacji znajdziesz, sprawdzając zasoby XAML.

  • Obsługa dziedziczenia wartości właściwości oraz inne flagi w metadanych, które pomagają w zgłaszaniu warunków dotyczących właściwości do usług frameworka, takich jak powiązanie danych, style lub implementacja układu frameworka. Aby uzyskać więcej informacji, zobacz Framework Property Metadata.

  • Koncepcja drzewa logicznego. Aby uzyskać więcej informacji, zobacz Trees in WPF.

  • Obsługa praktycznej implementacji systemu układu na poziomie struktury WPF, w tym zastąpienie metodą OnPropertyChanged, które mogą wykrywać zmiany we właściwościach wpływających na układ.

Jeśli tworzysz klasę, która pochodzi z ContentElement, dziedziczysz następujące funkcje oprócz tej udostępnionej przez DependencyObject:

Jeśli tworzysz klasę, która pochodzi z FrameworkContentElement, oprócz tej udostępnionej przez ContentElementuzyskasz następujące funkcje:

  • Obsługa stylów i scenorysów. Aby uzyskać więcej informacji, zobacz Style oraz Omówienie animacji.

  • 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 danej właściwości i inne flagi w metadanych, które ułatwiają zgłaszanie warunków dotyczących właściwości do usług platformy, takich jak wiązanie danych, style lub implementacja układu w ramach platformy. Aby uzyskać więcej informacji, zobacz Framework Property Metadata.

  • Nie dziedziczysz dostępu do modyfikacji systemu układu (takich jak ArrangeOverride). Implementacje systemu układu są dostępne tylko na FrameworkElement. Jednak dziedziczysz funkcję OnPropertyChanged, która może wykrywać zmiany we właściwościach wpływających na układ i zgłaszać je wszystkim hostom 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ę, z której można dziedziczyć. Aby uzyskać więcej informacji, zobacz WPF Content Model.

Inne klasy bazowe

DispatcherObject

DispatcherObject zapewnia obsługę modelu wątkowania WPF i umożliwia skojarzenie wszystkich obiektów utworzonych dla aplikacji WPF z Dispatcher. Nawet jeśli nie pochodzisz z UIElement, DependencyObjectlub Visual, warto rozważyć wyprowadzenie z DispatcherObject, aby uzyskać wsparcie dla tego modelu wątkowania. Aby uzyskać więcej informacji, zobacz Threading Model.

Wizualny

Visual implementuje koncepcję obiektu 2D, który zwykle wymaga prezentacji wizualnej w mniej więcej prostokątnym regionie. Rzeczywiste renderowanie Visual odbywa się w innych klasach (nie jest samodzielne), ale klasa Visual udostępnia znany typ 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 UIElement). Aby uzyskać więcej informacji, zobacz Visual Layer Programming.

nadający się do zamrożenia

Freezable symuluje niezmienność w obiekcie modyfikowalnym, zapewniając środki do generowania kopii obiektu, gdy obiekt niezmienny jest wymagany lub żądany ze względu na wydajność. Typ Freezable stanowi wspólną podstawę dla niektórych elementów graficznych, takich jak geometrie i pędzle, a także animacje. W szczególności Freezable nie jest Visual; może zawierać właściwości, które stają się podwłaściwościami, gdy Freezable jest stosowana do 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 Przegląd obiektów z możliwością zamrażania.

Animatable

Animatable jest klasą pochodną Freezable, która dodaje warstwę sterującą animacją i niektóre elementy pomocnicze, umożliwiające rozróżnienie aktualnie animowanych właściwości od tych, które nie są animowane.

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 kontrolek. Podstawową funkcją, którą Control włącza, jest tworzenie szablonów sterujących.

Zobacz też