FrameworkElement.OnApplyTemplate メソッド

定義

アプリケーション コードまたは内部プロセス (再構築レイアウト パスなど) が ApplyTemplate を呼び出すたびに呼び出されます。 最も簡単に言うと、これは、UI 要素がアプリに表示される直前に メソッドが呼び出されていることを意味します。 クラスの既定のテンプレート後ロジックに影響を与えるために、このメソッドをオーバーライドします。

protected:
 virtual void OnApplyTemplate() = OnApplyTemplate;
void OnApplyTemplate();
protected virtual void OnApplyTemplate();
function onApplyTemplate()
Protected Overridable Sub OnApplyTemplate ()

この例では、 OnApplyTemplate カスタム コントロールによって定義されたオーバーライドを示します。 オーバーライドは、テンプレートとスタイル システムを使用して独自のコントロール テンプレートを定義して適用する可能性がある呼び出し元を考慮するように設計されています。 コントロールは、定義の一部として、"UpButton" など、必要なテンプレート内の名前付き要素を属性化します。 次 OnApplyTemplate に、テンプレートの読み込み時にこの名前付けコントラクトに基づいてオブジェクト参照を取得し、 GetTemplateChild を呼び出します。 (設定されている値 ("UpButtonElement" など) は、クラス レベルで定義されているプライベート フィールドを参照して、クラスの他のメンバーがその部分をオブジェクトとして実行時に参照できるようにします)。また、この例では private メソッド UpdateStates を呼び出します (定義は示されていません)。 これは、 のもう 1 つの一般的なシナリオ OnApplyTemplateです。この場合、コントロールのすべての定義された状態を考慮し、 GoToState を呼び出して適切な状態を設定するプライベート メソッドを呼び出すことによって、コントロールの開始状態に対してビジュアル状態が設定されていることを確認します。

protected override void OnApplyTemplate()
{
    UpButtonElement = GetTemplateChild("UpButton") as RepeatButton;
    DownButtonElement = GetTemplateChild("DownButton") as RepeatButton;
    TextElement = GetTemplateChild("TextBlock") as TextBlock;

    UpdateStates(false);
}

注釈

FrameworkElement クラスによって定義されたメソッドですがOnApplyTemplateOnApplyTemplate動作とオーバーライドOnApplyTemplateのシナリオは、主に Control サブクラスに関連しています。 これは、XAML ファイルで通常定義する Template プロパティと、テンプレートを適用する内部Windows ランタイム ロジックがコントロール専用であるためです。 ContentPresenter と ContentControl には、特殊なテンプレート動作も存在します

実装者へのメモ

このメソッドの基本実装は、いくつかの基本的なレイアウト ロジックを提供するWindows ランタイム内部動作として実装されています。 実装から常に基本実装を呼び出す必要があります。 基本実装を参照しないと、レイアウト動作が望ましくない可能性があります。

派生クラスでは、次のシナリオの通知またはエントリ ポイントとしてこのメソッドを使用できます。

  • カスタム コードを使用して、ビジュアル ツリーの残りの部分をビルドします。
  • テンプレートから XAML 定義のビジュアル ツリーが適用された後にのみ機能するコードを実行します。 たとえば、テンプレートから取得した名前付き要素への参照を取得するコードは、 GetTemplateChild を呼び出して、これらのパーツのメンバーを他のテンプレート後ランタイム コードから参照できるようにします。
  • テンプレートのビジュアル ツリーが完了した後にのみ存在するのが理にかなっているサービスを導入します。
  • クラス定義のイベント ハンドラーをテンプレートの一部、または複合コントロールのコントロールの親にアタッチします。 たとえば、クラス ロジックで複合コントロールの TextBox テンプレート部分からルーティングされた KeyDown イベントを処理できます。 これにより、部分の低レベルの入力イベントに基づいて UI の状態が更新され、コントロールに固有でコントロールの親によって発生するその他のイベントが代わりに発生します。
  • 他の要因に依存するテンプレート内の要素の状態とプロパティを設定します。 たとえば、プロパティ値は、親要素を認識することや、特定の派生クラスが共通テンプレートを使用する場合にのみ検出できます。 ただし、適切に設計されたコントロールでは、 VisualStateManager を使用してそのビジュアル状態を処理する必要があることに注意してください。 この概念の詳細については、「 XAML コントロール テンプレート」を参照してください。

OnApplyTemplate は、多くの場合、 Loaded イベントよりも、テンプレートで作成されたビジュアル ツリーの調整に対処するのに適したポイントです。 Loaded イベントは、テンプレートが適用される前に発生する可能性があり、Loaded の時点でビジュアル ツリーが不完全である可能性があります。

適用対象

こちらもご覧ください