次の方法で共有


WPF での Code-Behind と XAML

コードビハインドは、XAML ページがマークアップコンパイルされる際に、マークアップで定義されたオブジェクトと結合されるコードを表す用語です。 このトピックでは、分離コードの要件と、XAML 内のコードに対する代替インライン コード メカニズムについて説明します。

このトピックには、次のセクションが含まれています。

前提 条件

このトピックでは、WPF で XAML を読み取り、CLR とオブジェクト指向プログラミングに関する基本的な知識があることを前提としています。

Code-Behind と XAML 言語

XAML 言語には、マークアップ ファイル側からコード ファイルをマークアップ ファイルに関連付けできるようにする言語レベルの機能が含まれています。 具体的には、XAML 言語は、x:Class ディレクティブ、x:サブクラス ディレクティブ、および x:ClassModifier ディレクティブ言語機能を定義します。 コードを生成する方法と、マークアップとコードを統合する方法は、XAML 言語が指定する内容の一部ではありません。 コードを統合する方法、アプリケーションモデルとプログラミング モデルで XAML を使用する方法、ビルド アクションまたはその他のサポートを決定するには、WPF などのフレームワークが必要です。

WPF のコードビハインド、イベント ハンドラー、および部分クラスの要件

  • 部分クラスは、ルート要素をサポートする型から派生する必要があります。

  • マークアップ コンパイル ビルド アクションの既定の動作では、分離コード側の部分クラス定義で派生を空白のままにすることができます。 コンパイルされた結果は、指定されていない場合でも、ページ ルートのバッキング型が部分クラスの基礎であると見なされます。 ただし、この動作に依存することはベスト プラクティスではありません。

  • 分離コードで記述するイベント ハンドラーはインスタンス メソッドである必要があり、静的メソッドにすることはできません。 これらのメソッドは、x:Classによって識別される CLR 名前空間内の部分クラスによって定義される必要があります。 イベント ハンドラーの名前を修飾して、別のクラス スコープ内のイベント配線用のイベント ハンドラーを探すように XAML プロセッサに指示することはできません。

  • ハンドラーは、バックエンド型システムの適切なイベントに対応するデリゲートと一致する必要があります。

  • Microsoft Visual Basic 言語の場合は、言語固有の Handles キーワードを使用して、ハンドラーを XAML の属性にアタッチするのではなく、ハンドラーをハンドラー宣言内のインスタンスやイベントに関連付けることができます。 ただし、Handles キーワードでは、特定のルーティング イベント シナリオや添付イベントなど、WPF イベント システムのすべての特定の機能をサポートできないため、この手法にはいくつかの制限があります。 詳細については、「Visual Basic および WPF イベント処理」を参照してください。

x:Code

x:Code は、XAML で定義されているディレクティブ要素です。 x:Code ディレクティブ要素には、インライン プログラミング コードを含めることができます。 インラインで定義されたコードは、同じページで XAML と対話できます。 次の例は、インライン C# コードを示しています。 コードが x:Code 要素内にあり、コードを <CDATA[...]]> で囲む必要があることに注意してください。このようにして、XAML プロセッサ (XAML スキーマまたは WPF スキーマを解釈する) がコンテンツをそのままXMLとして解釈しないように、XML の内容をエスケープします。

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="MyNamespace.MyCanvasCodeInline"
>
  <Button Name="button1" Click="Clicked">Click Me!</Button>
  <x:Code><![CDATA[
    void Clicked(object sender, RoutedEventArgs e)
    {
        button1.Content = "Hello World";
    }
  ]]></x:Code>
</Page>

インライン コードの制限事項

インライン コードの使用を回避または制限することを検討する必要があります。 アーキテクチャとコーディングの理念に関しては、マークアップと分離コードの分離を維持することで、デザイナーと開発者の役割がはるかに区別されます。 より技術的なレベルでは、インライン コード用に記述するコードは、XAML で生成された部分クラスに常に書き込み、既定の XML 名前空間マッピングのみを使用できるため、記述するのが難しい場合があります。 using ステートメントを追加できないため、実行する API 呼び出しの多くを完全に修飾する必要があります。 既定の WPF マッピングには、WPF アセンブリに存在するすべての CLR 名前空間が含まれていますが、含まれていません。他の CLR 名前空間に含まれる型とメンバーの呼び出しを完全修飾する必要があります。 インライン コードでは部分クラスを超えるものも定義できません。また、参照するすべてのユーザー コード エンティティは、生成された部分クラス内のメンバーまたは変数として存在する必要があります。 グローバル変数やビルド変数に対するマクロや #ifdef など、他の言語固有のプログラミング機能も使用できません。 詳細については、「x:Code 組み込み XAML 型を参照してください。

関連項目