オブジェクトの有効期間イベント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

WPFFrameworkElementフレームワーク レベルの要素 ( またはFrameworkContentElementのいずれかから派生するオブジェクト ) にはInitializedLoaded、、およびUnloadedの 3 つの一般的な有効期間イベントがあります。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

要素の一般的な有効期間イベントに基づいて構築されるアプリケーション モデルApplication要素WindowPage NavigationWindowFrame、、および 。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