WPF における分離コードと XAML

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

このトピックは、次のセクションで構成されています。

必須コンポーネント

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

コードビハインドと XAML 言語

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

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

  • 部分クラスは、ルート要素をバッキングする型から派生する必要があります。

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

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

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

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

x:Code

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

関連項目