FrameworkElement.Loaded イベント

2013/12/12

FrameworkElement が構築されてオブジェクト ツリーに追加されたときに発生します。

Namespace:  System.Windows
アセンブリ:  System.Windows (System.Windows.dll 内)
XAML の XMLNS: xmlns にマップされていません。

public event RoutedEventHandler Loaded
<frameworkElement Loaded="eventhandler"/>

このイベントは RoutedEventHandler デリゲート型を使用しますが、イベントはルーティングされません (多くの Windows Phone 入力イベントはルーティングされます)。ただし、通常、オブジェクト ツリーの XAML 読み込みの性質は、表面的にはバブル ルーティング イベント パターンに似たパターンを示します。読み込み前にオブジェクトですべてのプロパティを設定する必要があります。すべての XAML プロパティに値が指定された後は、子を持たないオブジェクトなど、最下位の入れ子のオブジェクトが最初に読み込まれます。子オブジェクトを持つオブジェクトでは、それらのプロパティの 1 つが、子オブジェクトを保持するプロパティです。したがって、オブジェクト ツリーが読み込まれると、Loaded イベントの発生シーケンスが上方向に発生します。ただし、このシーケンスでは実際に、各オブジェクト自体の Loaded イベントがその順序で発生します。イベント データは、さまざまな Loaded イベントで共有されません。これらは、個別のオブジェクト ソースごとに個別に発生したイベントです。

上記の説明には、Loaded イベントはツリーとは逆順で発生するという例外があります。したがって、Loaded の順序だけを判断基準とするようなアプリケーション ロジックは避けてください。Loaded 順序が変わる、いくつかの例を次に示します。

  • ほとんどの場合、適用されているコントロール テンプレートまたはデータ テンプレートから作成されるオブジェクトは、Loaded を発生させる最後のオブジェクトです。ただし、特定のコントロールが初期化で ApplyTemplate を使用して、強制的に早期にテンプレートを読み込む場合は、この順序の原則が異なることがあります。

  • テンプレート アプリケーションが原因で、および ItemsControl 内の項目のデータ プレゼンテーション規則に基づいて、項目が Loaded を、その親 ItemsControl が発生させた後、さらに他のメイン (テンプレート化されていない) 分岐オブジェクト ツリーが Loaded を発生させた後に発生させることがあります。

レイアウトによってサイズが変更されても、通常、オブジェクトの再読み込みは行われません。「SizeChanged」を参照してください。

Loaded と制御オブジェクトの有効期間

Windows Phone では、Loaded イベントがテンプレートの適用後に発生することは保証されません。これは、比較的一般的な制御シナリオで Loaded イベントを使用している場合に問題となる可能性があります。たとえば、ビジュアル ツリーを調べ、何か別のもののソースとして値を取得する場合や、新しい値が実行時にしかわからない状況で、テンプレート化された構成内の値を変更する場合です。そのような場合、テンプレート コンテンツのビジュアル ツリーを調べるための Windows Phone の VisualTreeHelper メソッドの呼び出しは、Loaded ハンドラーから直接呼び出した場合には機能しない可能性があります。

この問題を回避するには、いくつかの方法があります。各方法には、それぞれ利点および制限があります。

  • Loaded の処理を追加するのではなく、既存のコントロールから派生させる場合は、OnApplyTemplate をオーバーライドできます。OnApplyTemplate は特に、テンプレートからのツリーがあり、視覚効果を確認または調整しようとする、このような場合のコールバックとして役立ちます。制限として、単に既存のコントロールをアプリケーションの一部として使用しているのみである場合は、OnApplyTemplate に関して何も変更を加えることができません。

  • 引き続き、Loaded を使用することもできます。ただし、Loaded ハンドラー内の最初の呼び出しとして、そのコントロールに対して ApplyTemplate を呼び出す必要があります。ApplyTemplate は同期メソッドであるため、その呼び出しが行われて完了すると、テンプレートで作成したビジュアル ツリーが生成されています。この場合に ApplyTemplate を呼び出しても、Windows Phone ランタイムの側で動作が重複することはありません。制限として、該当する要素は Control の派生クラスである必要があります。

  • Loaded でなく、LayoutUpdated を処理できます。LayoutUpdated は、Windows Phone UI のコントロールを有効にするシーケンスの最後の「オブジェクトの有効期間」イベントです。LayoutUpdated の主要な制限は、LayoutUpdated が発生するのが、初期化時だけではない可能性があることです。また、LayoutUpdated は、レイアウト変更に関係するオブジェクトに対してのみ発生します。たとえば、レイアウト内のピアは、サイズが変更されている可能性があります。ビジュアル ツリーの観点で見ると、ピア オブジェクトではいくつかのプロパティ値が変更されただけでツリー構造は変わっていない可能性があり、また、LayoutUpdated の処理対象のオブジェクトのビジュアル ツリーはまったく変更されていない可能性があります。したがって、LayoutUpdated イベントが発生したときに、ビジュアル ツリーの調査や再確認が本当に必要なのかどうかを判断するには、独自のロジックの適用が必要となる可能性があります。

テンプレートの適用タイミングの問題に影響を受けない Loaded の処理シナリオもあることに注意してください。たとえば、テンプレート パーツにアクセスできない場合でも、Loaded が発生したオブジェクトに対してイベント ハンドラーを追加したりプロパティを設定したりすることはできます。たとえば、コードでオブジェクトを作成し、この時点でコンテンツ プロパティまたはコンテンツ コレクションに追加したり、初期の XAML でフックしないことを選択した入力型イベント ハンドラーを追加したりできます。

Windows Phone OS

サポート: 8.0, 7.1, 7.0

表示:
© 2014 Microsoft