オブジェクトの有効期間イベントObject Lifetime Events

このトピックでは、オブジェクトの有効期間における作成、使用、破棄のステージを示す特定の WPFWPF イベントについて説明します。This topic describes the specific WPFWPF events that signify stages in an object lifetime of creation, use, and destruction.


このトピックは、Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) クラスの既存の依存関係プロパティのコンシューマーの観点から依存関係プロパティを理解しており、「依存関係プロパティの概要」というトピックを読んでいることを前提としています。This topic assumes that you understand dependency properties from the perspective of a consumer of existing dependency properties on Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) classes, and have read the Dependency Properties Overview topic. このトピックの例を理解するには、Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) について理解し (「XAML の概要 (WPF)」を参照)、WPFWPF アプリケーションの記述方法を理解していることも必要です。In order to follow the examples in this topic, you should also understand Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) (see XAML Overview (WPF)) and know how to write WPFWPF applications.

オブジェクトの有効期間イベントObject Lifetime Events

Microsoft .NET Framework のマネージ コード内のすべてのオブジェクトのような一連の有効期間、作成、使用、および破棄のステージを経由します。All objects in Microsoft .NET Framework managed code go through a similar set of stages of life, creation, use, and destruction. また、多くのオブジェクトには、破棄フェーズの一環として発生する有効期間の終了ステージもあります。Many objects also have a finalization stage of life that occurs as part of the destruction phase. WPFWPF オブジェクト (具体的には WPFWPF が要素として識別するビジュアル オブジェクト) にも、共通する一連のオブジェクト有効期間ステージがあります。objects, more specifically the visual objects that WPFWPF identifies as elements, also have a set of common stages of object life. WPFWPF プログラミングおよびアプリケーション モデルでは、これらのステージが一連のイベントとして公開されます。The WPFWPF programming and application models expose these stages as a series of events. 有効期間イベントに関しては、WPFWPF に、全般的要素、ウィンドウ要素、ナビゲーション ホスト、アプリケーション オブジェクトの 4 種類の主要オブジェクトがあります。There are four main types of objects in WPFWPF with respect to lifetime events; elements in general, window elements, navigation hosts, and application objects. ウィンドウ要素とナビゲーション ホストは、さらに大きなビジュアル オブジェクト (要素) のグループにも含まれます。Windows and navigation hosts are also within the larger grouping of visual objects (elements). このトピックでは、すべての要素に共通する有効期間イベントについて説明し、次にアプリケーション定義、ウィンドウ要素、またはナビゲーション ホストに適用される特定の有効期間イベントについて説明します。This topic describes the lifetime events that are common to all elements and then introduces the more specific ones that apply to application definitions, windows or navigation hosts.

要素に関する共通の有効期間イベントCommon Lifetime Events for Elements

任意の WPF フレームワーク レベル要素 (いずれかから派生するこれらのオブジェクトFrameworkElementまたはFrameworkContentElement) の 3 つの一般的な有効期間イベントがあります: InitializedLoaded、およびUnloadedします。Any WPF framework-level element (those objects deriving from either FrameworkElement or FrameworkContentElement) has three common lifetime events: Initialized, Loaded, and Unloaded.


Initialized 最初に、発生し、そのコンス トラクターの呼び出しによって、オブジェクトの初期化にほぼ対応します。Initialized is raised first, and roughly corresponds to the initialization of the object by the call to its constructor. このイベントは初期化に応答して発生するため、オブジェクトのすべてのプロパティが設定されることが保証されます。Because the event happens in response to initialization, you are guaranteed that all properties of the object are set. (例外は、動的リソースまたはバインディングなどの式の使用です。これらは評価されない式となります。)すべてのプロパティが設定されている要件のシーケンスの結果としてInitializedを最初に、要素ツリー内の最下位の要素の順序で実行が表示されますマークアップで定義されている入れ子になった要素で発生している親要素のルートに向かってします。(An exception is expression usages such as dynamic resources or binding; these will be unevaluated expressions.) As a consequence of the requirement that all properties are set, the sequence of Initialized being raised by nested elements that are defined in markup appears to occur in order of deepest elements in the element tree first, then parent elements toward the root. この順序に従うのは、親子のリレーションシップおよびコンテインメントがプロパティであるためです。その結果、親のプロパティを設定する子要素も完全に初期化されるまで、親は初期化を報告できません。This order is because the parent-child relationships and containment are properties, and therefore the parent cannot report initialization until the child elements that fill the property are also completely initialized.

応答でハンドラーを記述するときに、 Initialized 、イベント ハンドラーがアタッチされている場合に要素ツリー (論理ツリーまたはビジュアル ツリー) 内の他のすべての要素が作成されたこと、特に保証がない検討する必要があります親要素です。When you are writing handlers in response to the Initialized event, you must consider that there is no guarantee that all other elements in the element tree (either logical tree or visual tree) around where the handler is attached have been created, particularly parent elements. メンバー変数が null である可能性や、基になるバインディングによってデータ ソースがまだ設定されていない可能性があります (式レベルでも)。Member variables may be null, or data sources might not yet be populated by the underlying binding (even at the expression level).


Loaded 次に発生します。Loaded is raised next. Loadedがレイアウト システムがレンダリングのために必要なすべての値を計算してから、最終的なレンダリングの前に、イベントが発生します。The Loaded event is raised before the final rendering, but after the layout system has calculated all necessary values for rendering. Loaded 論理ツリー内に含まれる要素が完了して、HWND とレンダリング サーフェイスを提供するプレゼンテーション ソースに接続する必要があります。Loaded entails that the logical tree that an element is contained within is complete, and connects to a presentation source that provides the HWND and the rendering surface. 前のバージョンに標準的なデータ バインディング (他のプロパティや直接定義されているデータ ソースなどのローカル ソースにバインド) が発生しているLoadedします。Standard data binding (binding to local sources, such as other properties or directly defined data sources) will have occurred prior to Loaded. 非同期データ バインディング (外部ソースまたは動的ソース) が発生する可能性もありますが、非同期であるという性質の定義から、その保証はできません。Asynchronous data binding (external or dynamic sources) might have occurred, but by definition of its asynchronous nature cannot be guaranteed to have occurred.

使用されるメカニズム、Loadedイベントが発生したとは異なりますInitializedします。The mechanism by which the Loaded event is raised is different than Initialized. Initializedイベントが発生した要素を完了した要素ツリーによる直接の調整なしの要素。The Initialized event is raised element by element, without a direct coordination by a completed element tree. これに対し、Loaded全体の要素ツリー (具体的には、論理ツリー) 全体にわたって調整動作としてイベントが発生します。By contrast, the Loaded event is raised as a coordinated effort throughout the entire element tree (specifically, the logical tree). ツリー内のすべての要素が読み込まれると、状態と見なされますが、Loadedイベントがルート要素で最初に発生します。When all elements in the tree are in a state where they are considered loaded, the Loaded event is first raised on the root element. Loaded各子要素でイベントが連続して発生します。The Loaded event is then raised successively on each child element.


この動作は、表面上は、ルーティング イベントのトンネリングに似ているとも言えます。This behavior might superficially resemble tunneling for a routed event. ただし、イベントからイベントへと伝達される情報はありません。However, no information is carried from event to event. 各要素を処理するには常にそのLoadedイベント、およびイベント データを処理済みとしてマークにその要素の次の効果がありません。Each element always has the opportunity to handle its Loaded event, and marking the event data as handled has no effect beyond that element.


Unloaded 最終発生し、プレゼンテーション ソースまたは削除されるビジュアル親によって開始されます。Unloaded is raised last and is initiated by either the presentation source or the visual parent being removed. ときにUnloadedが発生して、イベント ソースの親である要素の処理 (によって決定されるParentプロパティ) または論理またはビジュアル ツリーの上で任意の要素可能性がありますが既に設定されていない、つまりリソース参照、データ バインド、、スタイルは、通常または最後既知ランタイムの値は設定されません。When Unloaded is raised and handled, the element that is the event source parent (as determined by Parent property) or any given element upwards in the logical or visual trees may have already been unset, meaning that data binding, resource references, and styles may not be set to their normal or last known run-time value.

有効期間イベント アプリケーション モデルの要素Lifetime Events Application Model Elements

要素は、次のアプリケーション モデル要素の一般的な有効期間イベントの構築: ApplicationWindowPageNavigationWindow、およびFrameします。Building on the common lifetime events for elements are the following application model elements: Application, Window, Page, NavigationWindow, and Frame. これらの要素は、共通の有効期間イベントを拡張して、特定の目的に関連するイベントを追加します。These extend the common lifetime events with additional events that are relevant to their specific purpose. これらの詳細については、次のトピックで説明しています。These are discussed in detail in the following locations:

関連項目See also