オブジェクトの有効期間イベント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から派生したオブジェクト) には、InitializedLoadedUnloadedという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

要素の共通の有効期間イベントに基づく構築は、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