ツール アーキテクチャ
ユーザーはデザイナー上のコンテンツを各種の複雑な方法で操作します。 たとえば、デザイン サーフェイスに対しては、クリック、ドラッグ、修飾子キーを使用したドラッグ、キーボード入力、メニュー選択などの操作を実行します。 デザイナーが拡張性を保持するには、これらすべてのユーザー操作に対応できる基盤を提供する必要があります。 WPF Designer for Visual Studio には、拡張性と一貫性を備えた柔軟性のある構造化された入力システムが用意されています。ツール アーキテクチャのユーザー モデルは、コマンド、タスク、およびツールで構成されます。
コマンド
コマンドは、特定の動作を表す一意の識別子です。 たとえば、切り取りコマンドはテキストやオブジェクトを切り取ってクリップボードに追加する処理を表します。 このコマンドを実装するコードはアプリケーションによって異なり、1 つのアプリケーションに複数のコードが存在することもありますが、コマンド自体の機能は変わりません。 すべてのコマンドが ICommand インターフェイスを実装します。
コマンドが機能するためには、コマンドそのものに加えて 2 つのことが必要になります。 1 つは、コマンドを開始するユーザー入力 (「ジェスチャ」という) です。 コマンドを開始するジェスチャの例として、Ctrl + X キーを押すことやメニュー項目の選択などがあります。 もう 1 つは、コマンドを呼び出したときに実行されるコード実装です。
WPF では、RoutedCommand と呼ばれる ICommand インターフェイスの組み込み実装がユーザー入力の情報を指定されたコマンド ハンドラーに渡します。 WPF デザイナーには ToolCommand と呼ばれるコマンドの種類も用意されており、これによってコマンド ハンドラーの EventArgs 型に渡されるデザイナーの状態情報の量が増加します。
タスク
Task は、デザイナーで発生する実際のタスクを表すオブジェクトです。 たとえば、デザイナー上でのアイテムのドラッグは Task オブジェクトで表されます。 Task は、次の 3 つのコレクションを保持します。
タスクが処理するユーザー入力の種類を示す入力バインディングのコレクション。 例として、キーストロークの組み合わせやマウス ジェスチャを表すバインディングがあります。
標準 WPF ルーティング コマンドの実装を提供するコマンド バインディングのコレクション。
WPF デザイナー ツール コマンドの実装を提供するツール コマンド バインディングのコレクション。
たとえば、前に示したデザイナー上でのアイテムのドラッグを表す Task オブジェクトであれば、通常はマウス ダウン、マウス移動、マウス アップなどのコマンドが含まれます。 Task オブジェクトには、これらのコマンドのそれぞれに入力ジェスチャをバインドする入力バインディングも含まれます。
ツール
Tool は、ユーザー入力の処理に使用されるクラスです。 すべてのユーザー入力は 1 つまたは複数の入力イベントとしてデザイナーに渡されます。入力イベントには、使用された入力ジェスチャやデザイナーの状態に関する情報を表すデータが含まれています。 入力イベントは、現在アクティブな Tool オブジェクトにルーティングされ、このオブジェクトによって入力データが入力バインディングに変換されます。 指定された入力ジェスチャのバインディングが見つかった場合は、そのバインディング内のコマンドが実行されます。
Tool オブジェクトは、デザイナーのグローバル モードを表します。 たとえば、ユーザーがデザイン サーフェイス上のコンポーネントを選択する場合は、そのモードが有効になります。現在のツールに用意されたタスクがそれらのタスクを可能にするコマンドに特定の入力ジェスチャをバインドする入力バインディングとコマンドのコレクションを提供するからです。 ユーザーが新しいコントロールを作成する場合は、アクティブなツールが異なり、提供されるバインディングも異なるため、ユーザーは同じジェスチャを使用できる可能性もありますが、ジェスチャは別のコマンドにバインドされます。