次の方法で共有


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

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

前提 条件

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

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

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

要素の一般的な有効期間イベント

WPF フレームワーク レベルの要素 (FrameworkElement または FrameworkContentElementから派生したオブジェクト) には、InitializedLoaded、および Unloadedの 3 つの一般的な有効期間イベントがあります。

初期化

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

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

ロード

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

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

手記

この動作は、ルーティング イベントのトンネリングに表面的に似ている可能性があります。 ただし、イベント間で情報は伝達されません。 各要素には常に Loaded イベントを処理する機会があり、イベント データを処理済みとしてマークしても、その要素を超える影響はありません。

荷下ろししました

Unloaded は最後に発生し、プレゼンテーション ソースまたはビジュアルの親が削除されることによって開始されます。 Unloaded が発生して処理されると、(Parent プロパティによって決定される) イベントソースの親となる要素、または論理ツリーやビジュアルツリー上の上位要素が既に設定解除されている可能性があります。これにより、データ バインディング、リソース参照、およびスタイルが通常のランタイム値や既知の最新ランタイム値に設定されない場合があります。

ライフタイム イベント アプリケーション モデル要素

要素の一般的な有効期間イベントに基づくアプリケーション モデル要素は、ApplicationWindowPageNavigationWindow、および Frameです。 これにより、一般的な有効期間イベントが拡張され、特定の目的に関連する追加のイベントが追加されます。 詳細については、次の場所で説明します。

参照