オブジェクトの有効期間イベント
ここでは、オブジェクトの作成、使用、および破棄の有効期間におけるステージを示す特定の WPF イベントについて説明します。
このトピックは、次のセクションで構成されています。
- 必要条件
- オブジェクトの有効期間イベント
- 要素に関する共通の有効期間イベント
- 有効期間イベント アプリケーション モデルの要素
- 関連トピック
必要条件
このトピックでは、ユーザーが Windows Presentation Foundation (WPF) クラスの既存の依存関係プロパティの使用という観点から依存関係プロパティを理解し、「依存関係プロパティの概要」トピックを通読していることを前提としています。 このトピックの例を理解するには、Extensible Application Markup Language (XAML) についての理解があり (「XAML の概要 (WPF)」を参照)、WPF アプリケーションの記述方法を理解していることも必要です。
オブジェクトの有効期間イベント
Microsoft .NET Framework マネージ コードのオブジェクトはすべて、作成、使用、および破棄という一連の有効期間のステージを経由します。 また、多くのオブジェクトには、破棄フェーズの一環として発生する有効期間の終了ステージがあります。 WPF オブジェクト (具体的には WPF が要素として識別するビジュアル オブジェクト) にも、共通する一連のオブジェクト有効期間ステージがあります。 WPF プログラミングおよびアプリケーション モデルでは、これらのステージが一連のイベントとして公開されます。 有効期間イベントに関しては、WPF に、全般的要素、ウィンドウ要素、ナビゲーション ホスト、およびアプリケーション オブジェクトの 4 種類の主要オブジェクトがあります。 ウィンドウ要素とナビゲーション ホストは、さらに大きなビジュアル オブジェクト (要素) のグループ内にも存在します。 このトピックでは、すべての要素に共通する有効期間イベントについて説明し、次にアプリケーション定義、ウィンドウ要素、またはナビゲーション ホストに適用される特定の有効期間イベントについて説明します。
要素に関する共通の有効期間イベント
任意の WPF フレームワーク レベル要素 (FrameworkElement または FrameworkContentElement から派生しているオブジェクト) には、次の 3 つの共通する有効期間イベントがあります。それらは、Initialized、Loaded、および Unloaded です。
初期化
Initialized が最初に発生し、コンストラクターの呼び出しによって、オブジェクトの初期化に大まかに対応します。 イベントは初期化に応答して発生するため、オブジェクトのすべてのプロパティが設定されることが保証されます (例外は、動的リソースまたはバインディングなどの評価されない式の使用です)。 すべてのプロパティが設定されるという要件の結果として、マークアップで定義される入れ子にした要素によって発生する一連の Initialized は、要素ツリーの最下位の要素からルート方向の親要素への順序で発生するように見えます。 この順序は親子のリレーションシップおよびコンテインメントがプロパティであるためで、親のプロパティを設定する子要素も完全に初期化されるまで、親は初期化を報告できません。
Initialized イベントへの応答としてハンドラーを記述する際は、ハンドラーが添付される周辺の要素ツリー (論理ツリーまたはビジュアル ツリー) 内に他のすべての要素、特に親要素が作成されているという保証がないことを考慮する必要があります。 メンバー変数が null であるか、データ ソースが基になるバインディングによってまだ設定されていない可能性があります (式レベルでも)。
読み込み済み
Loaded が次に発生します。 Loaded イベントは、最終的な描画の前に発生しますが、それはレイアウト システムが描画に必要なすべての値を計算した後です。 Loaded は、要素を含む論理ツリーが完全である場合にのみ発生し、HWND とレンダリング サーフェイスを提供するプレゼンテーション ソースに接続されています。 標準データ バインディング (他のプロパティや直接定義したデータ ソースなどのローカル ソースへのバインディング) は、Loaded の前に発生しています。 非同期データ バインディング (外部ソースまたは動的ソース) が発生している可能性もありますが、非同期であるという性質の定義から、その保証はできません。
Loaded イベントを発生させる機構は、Initialized とは異なります。 Initialized イベントは、要素単位で発生し、完全な要素ツリーによる直接の調整はありません。 これに対し、Loaded イベントは、要素ツリー (特に、論理ツリー) 全体にわたる調整動作として発生します。 ツリーのすべての要素が読み込まれたと見なされる状態にあると、Loaded イベントは、最初にルート要素で発生します。 次に、Loaded イベントは、各子要素で連続して発生します。
メモ |
---|
この動作は、表面上は、ルーティング イベントのトンネリングに似ているとも言えます。ただし、イベントからイベントへと伝達される情報はありません。各要素は常に Loaded イベントを処理することができ、イベント データを処理済みとしてマークしても、その要素以外への影響はありません。 |
アンロード
最後に Unloaded が発生し、プレゼンテーション ソースまたは削除されているビジュアル親によって開始されます。 Unloaded が発生して処理される際、(Parent プロパティによって決定される) イベント ソースの親または、論理ツリーまたはビジュアル ツリー内にある任意の要素が既に設定解除されている可能性があります。これは、データ バインディング、リソース参照、およびスタイルが、通常または前回のランタイム値に設定されていない可能性があることを意味します。
有効期間イベント アプリケーション モデルの要素
要素の共通する有効期間イベントに基づいて構築されたアプリケーション モデル要素には、Application、Window、Page、NavigationWindow、および Frame があります。 これらの要素は、共通する有効期間イベントを、特定の目的に関する追加イベントで拡張します。 これらの詳細については、次のトピックで説明しています。