更新 : 2007 年 11 月
ユーザーはデザイナ上のコンテンツを各種の複雑な方法で操作します。たとえば、デザイン サーフェイスに対しては、クリック、ドラッグ、修飾子キーを使用したドラッグ、キーボード入力、メニュー選択などの操作を実行します。デザイナが拡張性を保持するには、これらすべてのユーザー操作に対応できる基盤を提供する必要があります。Windows Presentation Foundation (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 オブジェクトは、デザイナのグローバル モードを表します。たとえば、ユーザーがデザイン サーフェイス上のコンポーネントを選択する場合は、そのモードが有効になります。現在のツールに用意されたタスクがそれらのタスクを可能にするコマンドに特定の入力ジェスチャをバインドする入力バインディングとコマンドのコレクションを提供するからです。ユーザーが新しいコントロールを作成する場合は、アクティブなツールが異なり、提供されるバインディングも異なるため、ユーザーは同じジェスチャを使用できる可能性もありますが、ジェスチャは別のコマンドにバインドされます。