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

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

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

  • 前提条件

  • 分離コードと XAML 言語

  • WPF における分離コード、イベント ハンドラー、および部分クラスの要件

  • x:Code

  • インライン コードの制限

前提条件

このトピックでは、「XAML の概要 (WPF)」を通読していることと、CLR およびオブジェクト指向プログラミングに関する基礎知識があることを前提にしています。

分離コードと XAML 言語

XAML 言語には、コード ファイルをマークアップ ファイル側からマークアップ ファイルに関連付けることのできる言語レベルの機能が含まれています。 具体的には、XAML 言語で x:Class ディレクティブx:Subclass ディレクティブ および 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 要素内に含まれており、XML のコンテンツをエスケープする <CDATA[...]]> でコードを囲んでいるのは、XAML プロセッサ (XAML スキーマまたは WPF スキーマを解釈) がこのコンテンツをリテラルに XML として解釈しないようにする必要があるためです。

<Page
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://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 型」を参照してください。

参照

参照

x:Code 組み込み XAML 型

概念

XAML の概要 (WPF)

WPF アプリケーション (WPF) のビルド

XAML 構文の詳細