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

このトピックでは、オブジェクトの有効期間における作成、使用、破棄のステージを示す特定の WPF イベントについて説明します。

必須コンポーネント

このトピックは、Windows Presentation Foundation (WPF) クラスの既存の依存関係プロパティのコンシューマーの観点から依存関係プロパティを理解しており、「依存関係プロパティの概要」というトピックを読んでいることを前提としています。 このトピックの例を理解するには、Extensible Application Markup Language (XAML) について理解し (「XAML の概要 (WPF)」を参照)、WPF アプリケーションの記述方法を理解していることも必要です。

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

Microsoft .NET Framework マネージド コードのオブジェクトはすべて、作成、使用、破棄という一連の有効期間のステージを経由します。 また、多くのオブジェクトには、破棄フェーズの一環として発生する有効期間の終了ステージもあります。 WPF オブジェクト (具体的には WPF が要素として識別するビジュアル オブジェクト) にも、共通する一連のオブジェクト有効期間ステージがあります。 WPF プログラミングおよびアプリケーション モデルでは、これらのステージが一連のイベントとして公開されます。 有効期間イベントに関しては、WPF に、全般的要素、ウィンドウ要素、ナビゲーション ホスト、アプリケーション オブジェクトの 4 種類の主要オブジェクトがあります。 ウィンドウ要素とナビゲーション ホストは、さらに大きなビジュアル オブジェクト (要素) のグループにも含まれます。 このトピックでは、すべての要素に共通する有効期間イベントについて説明し、次にアプリケーション定義、ウィンドウ要素、またはナビゲーション ホストに適用される特定の有効期間イベントについて説明します。

要素に関する共通の有効期間イベント

任意の WPF フレームワーク レベル要素 (FrameworkElement または FrameworkContentElement から派生しているオブジェクト) には、InitializedLoadedUnloaded という 3 つの共通する有効期間イベントがあります。

初期化済み

Initialized が最初に発生します。これは、コンストラクターの呼び出しによるオブジェクトの初期化にほぼ対応します。 このイベントは初期化に応答して発生するため、オブジェクトのすべてのプロパティが設定されることが保証されます。 (例外は、動的リソースまたはバインディングなどの式の使用です。これらは評価されない式となります。)すべてのプロパティが設定されるという要件の結果、マークアップで定義される入れ子の要素によって発生する一連の Initialized は、要素ツリーの最下位の要素から始まって、ルート方向の親要素に向かう順序で発生するように見えます。 この順序に従うのは、親子のリレーションシップおよびコンテインメントがプロパティであるためです。その結果、親のプロパティを設定する子要素も完全に初期化されるまで、親は初期化を報告できません。

Initialized イベントへの応答としてハンドラーを記述する際は、ハンドラーが接続される要素ツリー (論理ツリーまたはビジュアル ツリーのいずれか) の他のすべての要素、特に親要素が作成された保証がないことを考慮する必要があります。 メンバー変数が null である可能性や、基になるバインディングによってデータ ソースがまだ設定されていない可能性があります (式レベルでも)。

読み込み

次に、Loaded が発生します。 Loaded イベントが発生するのは、最終的な描画の前、ただし描画に必要なすべての値がレイアウト システムによって計算された後です。 Loaded は、要素を含む論理ツリーが完全である場合にのみ発生し、HWND とレンダリング サーフェイスを提供するプレゼンテーション ソースに接続されます。 標準データ バインディング (他のプロパティや直接定義したデータ ソースなどのローカル ソースへのバインディング) は、Loaded の前に発生します。 非同期データ バインディング (外部ソースまたは動的ソース) が発生する可能性もありますが、非同期であるという性質の定義から、その保証はできません。

Loaded イベントを発生させるメカニズムは、Initialized とは異なります。 Initialized イベントは、要素単位で発生し、完全な要素ツリーによる直接の調整はありません。 これに対し、Loaded イベントは、要素ツリー (特に、論理ツリー) 全体にわたる調整動作として発生します。 ツリーのすべての要素が読み込まれたと見なされる状態になると、Loaded イベントは、最初にルート要素で発生します。 次に、Loaded イベントは、各子要素で連続して発生します。

注意

この動作は、表面上は、ルーティング イベントのトンネリングに似ているとも言えます。 ただし、イベントからイベントへと伝達される情報はありません。 各要素は常に Loaded イベントを処理することができ、イベント データを処理済みとしてマークしても、その要素以外への影響はありません。

アンロードされました

最後に Unloaded が発生します。これは、プレゼンテーション ソースまたは削除中のビジュアル親によって開始されます。 Unloaded が発生して処理されるときには、(Parent プロパティによって決定される) イベント ソースの親である要素、または論理ツリーまたはビジュアル ツリーの上方向にある任意の要素が既に設定解除されている可能性があります。これは、データ バインディング、リソース参照、スタイルが、通常の、または判明している最後の実行時の値に設定されていない可能性があることを意味します。

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

要素の共通の有効期間イベントに基づいて構築されたアプリケーション モデル要素には、ApplicationWindowPageNavigationWindowFrame があります。 これらの要素は、共通の有効期間イベントを拡張して、特定の目的に関連するイベントを追加します。 これらの詳細については、次のトピックで説明しています。

関連項目