Udostępnij za pośrednictwem


Zdarzenia okresu istnienia obiektu

W tym temacie opisano konkretne zdarzenia WPF, które oznaczają etapy w okresie istnienia obiektu tworzenia, używania i zniszczenia.

Warunki wstępne

Zakłada się w tym temacie, że rozumiesz właściwości zależności z punktu widzenia użytkownika istniejących właściwości zależności w klasach Windows Presentation Foundation (WPF) i że przeczytałeś temat omówienie właściwości zależności. Aby postępować zgodnie z przykładami w tym temacie, należy również zrozumieć język XAML (zobacz XAML wWPF ) i wiedzieć, jak pisać aplikacje WPF.

Zdarzenia okresu istnienia obiektu

Wszystkie obiekty w kodzie zarządzanym programu Microsoft .NET Framework przechodzą przez podobny zestaw etapów życia, tworzenia, używania i zniszczenia. Wiele obiektów ma również etap finalizacji życia, który występuje w ramach fazy zniszczenia. Obiekty WPF, w szczególności obiekty wizualne, które WPF identyfikuje jako elementy, mają również zestaw typowych etapów życia obiektu. Modele programowania i aplikacji WPF uwidaczniają te etapy jako serię zdarzeń. Istnieją cztery główne typy obiektów w WPF w kontekście zdarzeń życiowych: elementy jako takie, elementy okna, hosty nawigacji i obiekty aplikacji. Hosty systemu Windows i nawigacji znajdują się również w większej grupie obiektów wizualnych (elementów). W tym temacie opisano zdarzenia okresu istnienia wspólne dla wszystkich elementów, a następnie wprowadzono bardziej szczegółowe, które mają zastosowanie do definicji aplikacji, okien lub hostów nawigacji.

Typowe zdarzenia okresu istnienia dla elementów

Każdy element na poziomie struktury WPF (te obiekty pochodzące z FrameworkElement lub FrameworkContentElement) mają trzy typowe zdarzenia okresu istnienia: Initialized, Loadedi Unloaded.

Zainicjowany

Initialized jest wywoływana jako pierwsza i w przybliżeniu odpowiada inicjowaniu obiektu przez wywołanie jego konstruktora. Ponieważ zdarzenie odbywa się w odpowiedzi na inicjowanie, masz gwarancję, że wszystkie właściwości obiektu są ustawione. (Wyjątek dotyczy użycia wyrażeń, takich jak zasoby dynamiczne lub powiązanie; będą to wyrażenia nieszacowane). W wyniku wymagania, że wszystkie właściwości są ustawione, sekwencja Initialized wywoływana przez zagnieżdżone elementy zdefiniowane w adiustacji wydaje się występować w kolejności najgłębszych elementów w drzewie elementów, a następnie elementów nadrzędnych w kierunku katalogu głównego. Ta kolejność wynika z tego, że relacje nadrzędno-podrzędne i zawartość są właściwościami, dlatego rodzic nie może zgłaszać inicjalizacji, dopóki elementy podrzędne, które wypełniają daną właściwość, nie zostaną całkowicie zainicjowane.

Podczas pisania obsług w odpowiedzi na zdarzenie Initialized należy wziąć pod uwagę, że nie ma gwarancji, że wszystkie inne elementy w drzewie elementów (drzewo logiczne lub drzewo wizualne) wokół miejsca, gdzie dołączono obsługę, w szczególności elementy nadrzędne, zostały utworzone. Zmienne składowe mogą mieć wartość null lub źródła danych mogą nie zostać jeszcze wypełnione przez powiązanie bazowe (nawet na poziomie wyrażenia).

Załadowany

Loaded zostanie aktywowana w następnej kolejności. Zdarzenie Loaded jest wywoływane przed ostatecznym renderowaniem, ale po obliczeniu wszystkich wartości niezbędnych do renderowania przez system układu. Loaded wiąże się z tym, że drzewo logiczne, w ramach którego znajduje się element, jest kompletne i połączone ze źródłem prezentacji, które dostarcza HWND i powierzchnię renderowania. Powiązanie danych standardowych (powiązanie ze źródłami lokalnymi, takie jak inne właściwości lub bezpośrednio zdefiniowane źródła danych), nastąpi przed Loaded. Mogło wystąpić asynchroniczne powiązanie danych (ze źródeł zewnętrznych lub dynamicznych), ale z definicji jego asynchronicznego charakteru nie można tego zagwarantować.

Mechanizm, za pomocą którego jest wywoływane zdarzenie Loaded, różni się od Initialized. Zdarzenie Initialized jest wywoływane element po elemencie, bez bezpośredniej koordynacji przez zakończone drzewo elementów. Z kolei zdarzenie Loaded jest podnoszone jako skoordynowane działanie w całym drzewie elementów (w szczególności drzewie logicznym). Gdy wszystkie elementy w drzewie są w stanie, w którym są uznawane za załadowane, zdarzenie Loaded jest najpierw wywoływane w elemecie głównym. Zdarzenie Loaded jest następnie wywoływane kolejno dla każdego elementu podrzędnego.

Notatka

To zachowanie może pozornie przypominać tunelowanie dla wydarzenia routowanego. Jednak żadne informacje nie są przenoszone ze zdarzenia do zdarzenia. Każdy element zawsze ma możliwość obsługi swojego zdarzenia Loaded, a oznaczenie danych zdarzenia jako obsłużonych nie ma wpływu poza ten element.

Rozładowane

Unloaded jest wywoływany ostatnio i jest inicjowany przez źródło prezentacji lub obiekt nadrzędny wizualizacji, który jest usuwany. Gdy Unloaded jest wywoływana i obsługiwana, element, który jest elementem nadrzędnym źródła zdarzeń (określonym przez właściwość Parent) lub dowolnym elementem w górę w drzewach logicznych lub wizualnych, może już nie być ustawiony, co oznacza, że powiązanie danych, odwołania do zasobów i style mogą nie być ustawione na ich normalną lub ostatnią znaną wartość czasu wykonywania.

Elementy modelu aplikacji zdarzeń życiowych

W oparciu o typowe zdarzenia okresu istnienia elementów są następujące elementy modelu aplikacji: Application, Window, Page, NavigationWindowi Frame. Rozszerzają one typowe zdarzenia życiowe o dodatkowe zdarzenia, które są istotne dla ich specyficznego celu. Zostały one szczegółowo omówione w następujących lokalizacjach:

Zobacz też