WPF における分離コードと XAMLCode-Behind and XAML in WPF

分離コードは、マークアップで定義されたオブジェクトと結合されるコードを記述するために使用される用語です。 XAMLXAML ページがマークアップコンパイルされている場合です。Code-behind is a term used to describe the code that is joined with markup-defined objects, when a XAMLXAML page is markup-compiled. このトピックでは、分離コードの要件と、XAMLXAMLのコードの代替インラインコード機構について説明します。This topic describes requirements for code-behind as well as an alternative inline code mechanism for code in XAMLXAML.

このトピックは、次のセクションで構成されています。This topic contains the following sections:

必要条件Prerequisites

このトピックでは、「XAML の概要 (WPF)」を読み、CLR とオブジェクト指向プログラミングに関する基本的な知識を持っていることを前提としています。This topic assumes that you have read the XAML Overview (WPF) and have some basic knowledge of the CLR and object-oriented programming.

分離コードと XAML 言語Code-Behind and the XAML Language

XAML 言語には、マークアップファイル側からコードファイルをマークアップファイルに関連付けることができるようにする言語レベルの機能が含まれています。The XAML language includes language-level features that make it possible to associate code files with markup files, from the markup file side. 具体的には、XAML 言語では、言語機能のX:Class ディレクティブx:Subclass ディレクティブ、およびx:ClassModifier ディレクティブが定義されています。Specifically, the XAML language defines the language features x:Class Directive, x:Subclass Directive, and x:ClassModifier Directive. コードをどのように生成するか、およびマークアップとコードを統合する方法は、XAML 言語が指定する内容の一部ではありません。Exactly how the code should be produced, and how to integrate markup and code, is not part of what the XAML language specifies. WPF などのフレームワークによって、コードを統合する方法、アプリケーションとプログラミングモデルで XAML を使用する方法、ビルドアクションやその他のすべてのサポートが必要であるかどうかが決定されます。It is left up to frameworks such as WPF to determine how to integrate the code, how to use XAML in the application and programming models, and the build actions or other support that all this requires.

WPF の分離コード、イベントハンドラー、および部分クラスの要件Code-behind, Event Handler, and Partial Class Requirements in WPF

  • 部分クラスは、ルート要素をバッキングする型から派生する必要があります。The partial class must derive from the type that backs the root element.

  • マークアップコンパイルビルドアクションの既定の動作では、分離コード側の部分クラス定義で派生を空白のままにすることができます。Note that under the default behavior of the markup compile build actions, you can leave the derivation blank in the partial class definition on the code-behind side. コンパイルされた結果は、指定されていない場合でも、ページルートのバッキング型が部分クラスの基礎となることを前提としています。The compiled result will assume the page root's backing type to be the basis for the partial class, even if it not specified. ただし、この動作に依存することは、ベストプラクティスではありません。However, relying on this behavior is not a best practice.

  • 分離コードで記述するイベントハンドラーは、インスタンスメソッドである必要があり、静的メソッドにすることはできません。The event handlers you write in the code-behind must be instance methods and cannot be static methods. これらのメソッドは、x:Classによって識別される CLR 名前空間内の部分クラスによって定義する必要があります。These methods must be defined by the partial class within the CLR namespace identified by x:Class. イベントハンドラーの名前を修飾して、別のクラススコープのイベントのイベントハンドラーを検索するように XAMLXAML プロセッサに指示することはできません。You cannot qualify the name of an event handler to instruct a XAMLXAML processor to look for an event handler for event wiring in a different class scope.

  • ハンドラーは、バッキング型システム内の適切なイベントのデリゲートと一致する必要があります。The handler must match the delegate for the appropriate event in the backing type system.

  • 特に、Microsoft Visual Basic 言語では、言語固有の Handles キーワードを使用して、ハンドラーをハンドラー宣言内のインスタンスおよびイベントに関連付けることができます。これは、XAMLXAMLの属性を持つハンドラーをアタッチすることではありません。For the Microsoft Visual Basic language specifically, you can use the language-specific Handles keyword to associate handlers with instances and events in the handler declaration, instead of attaching handlers with attributes in XAMLXAML. ただし、この方法にはいくつかの制限があります。 Handles キーワードは、特定のルーティングイベントのシナリオや添付イベントなど、WPFWPF イベントシステムの特定の機能をすべてサポートすることができないためです。However, this technique does have some limitations because the Handles keyword cannot support all of the specific features of the WPFWPF event system, such as certain routed event scenarios or attached events. 詳細については、「 Visual Basic と WPF のイベント処理」を参照してください。For details, see Visual Basic and WPF Event Handling.

x:Codex:Code

x:CodeXAMLXAMLで定義されたディレクティブ要素です。x:Code is a directive element defined in XAMLXAML. x:Code ディレクティブ要素には、インラインプログラミングコードを含めることができます。An x:Code directive element can contain inline programming code. インラインで定義されているコードは、同じページの XAMLXAML と対話できます。The code that is defined inline can interact with the XAMLXAML on the same page. 次の例は、 C#インラインコードを示しています。The following example illustrates inline C# code. コードが x:Code 要素内にあり、<CDATA[...]]> でコードを囲む必要があることに注意してください。 XML の内容をエスケープして、XAMLXAML プロセッサ (XAMLXAML スキーマまたは WPFWPF スキーマを解釈する) が試行されないようにします。コンテンツは文字どおり XML として解釈されます。Notice that the code is inside the x:Code element and that the code must be surrounded by <CDATA[...]]> to escape the contents for XML, so that a XAMLXAML processor (interpreting either the XAMLXAML schema or the WPFWPF schema) will not try to interpret the contents literally as 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>

インラインコードの制限事項Inline Code Limitations

インラインコードの使用を回避または制限することを検討してください。You should consider avoiding or limiting the use of inline code. アーキテクチャとコーディングの理念に関して、マークアップと分離コードの分離を維持することで、デザイナーと開発者のロールがより明確になります。In terms of architecture and coding philosophy, maintaining a separation between markup and code-behind keeps the designer and developer roles much more distinct. より技術的なレベルでは、インラインコード用に記述するコードを記述するのは困難な場合があります。これは、XAMLXAML 生成された部分クラスに常に書き込みを行い、既定の XML 名前空間マッピングのみを使用できるためです。On a more technical level, the code that you write for inline code can be awkward to write, because you are always writing into the XAMLXAML generated partial class, and can only use the default XML namespace mappings. using ステートメントを追加することはできないため、作成する API 呼び出しの多くを完全に修飾する必要があります。Because you cannot add using statements, you must fully qualify many of the API calls that you make. 既定の WPFWPF マッピングには、WPFWPF アセンブリに存在するほとんどの CLR 名前空間が含まれます。他の CLR 名前空間内に含まれる型およびメンバーの呼び出しを完全に修飾する必要があります。The default WPFWPF mappings include most but not all CLR namespaces that are present in the WPFWPF assemblies; you will have to fully qualify calls to types and members contained within the other CLR namespaces. また、インラインコードで部分クラスを超えるものを定義することはできません。また、参照するすべてのユーザーコードエンティティは、生成された部分クラス内のメンバーまたは変数として存在する必要があります。You also cannot define anything beyond the partial class in the inline code, and all user code entities you reference must exist as a member or variable within the generated partial class. マクロや、グローバル変数やビルド変数に対する #ifdef など、言語固有のプログラミング機能も使用できません。Other language specific programming features, such as macros or #ifdef against global variables or build variables, are also not available. 詳細については、「 X:Code 組み込み XAML 型」を参照してください。For more information, see x:Code Intrinsic XAML Type.

関連項目See also