コマンド実行の概要Commanding Overview

コマンド実行は Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) の入力メカニズムであり、デバイス入力よりいっそうセマンティックなレベルでの入力処理を提供します。Commanding is an input mechanism in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) which provides input handling at a more semantic level than device input. コマンドの例は、多くのアプリケーションで見られるコピー切り取り貼り付けなどの操作です。Examples of commands are the Copy, Cut, and Paste operations found on many applications.

この概要では、WPFWPF でのコマンドとはどういうものか、コマンド実行モデルに含まれるクラス、アプリケーションでコマンドを作成して使用する方法を定義します。This overview defines what commands are in WPFWPF, which classes are part of the commanding model, and how to use and create commands in your applications.

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

コマンドとはWhat Are Commands?

コマンドには、いくつかの目的があります。Commands have several purposes. 第 1 の目的は、コマンドを呼び出すセマンティクスとオブジェクトを、コマンドを実行するロジックから分離することです。The first purpose is to separate the semantics and the object that invokes a command from the logic that executes the command. これにより、複数の異なるソースから同じコマンド ロジックを呼び出すことができ、異なるターゲットに合わせてコマンド ロジックをカスタマイズできます。This allows for multiple and disparate sources to invoke the same command logic, and it allows the command logic to be customized for different targets. たとえば、多くのアプリケーションで使われる編集操作であるコピー切り取り貼り付けは、コマンドを使って実装されていれば、異なるユーザー アクションを使って呼び出すことができます。For example, the editing operations Copy, Cut, and Paste, which are found in many applications, can be invoked by using different user actions if they are implemented by using commands. ユーザーは、ボタンをクリックして、メニューの項目を選択して、または Ctrl + X などのキーの組み合わせを使って、選んだオブジェクトやテキストを切り取ることができます。An application might allow a user to cut selected objects or text by either clicking a button, choosing an item in a menu, or using a key combination, such as CTRL+X. コマンドを使うことにより、各種のユーザー アクションを同じロジックにバインドできます。By using commands, you can bind each type of user action to the same logic.

コマンドのもう 1 つの目的は、アクションを実行できるかどうかを示すことです。Another purpose of commands is to indicate whether an action is available. 再びオブジェクトやテキストの切り取りを例にすると、アクションは何かを選択したときにのみ意味があります。To continue the example of cutting an object or text, the action only makes sense when something is selected. 何も選ばないでオブジェクトまたはテキストを切り取ろうとすると、何も起こりません。If a user tries to cut an object or text without having anything selected, nothing would happen. ユーザーにこのことを示すため、多くのアプリケーションでは、ボタンやメニュー項目を無効にして、アクションを実行できるかどうかをユーザーが認識できるようにしています。To indicate this to the user, many applications disable buttons and menu items so that the user knows whether it is possible to perform an action. コマンドでは、CanExecute メソッドを実装することで、アクションが実行可能かどうかを示すことができます。A command can indicate whether an action is possible by implementing the CanExecute method. ボタンは、CanExecuteChanged イベントをサブスクライブでき、CanExecutefalse が返された場合は無効に、CanExecutetrue が返された場合は有効にできます。A button can subscribe to the CanExecuteChanged event and be disabled if CanExecute returns false or be enabled if CanExecute returns true.

コマンドのセマンティクスはアプリケーションおよびクラス全体で統一できますが、アクションのロジックは対象となる特定のオブジェクトに固有です。The semantics of a command can be consistent across applications and classes, but the logic of the action is specific to the particular object acted upon. キーの組み合わせ Ctrl + X キーはテキスト クラス、イメージ クラス、Web ブラウザーの切り取りコマンドを呼び出しますが、切り取り操作を実行する実際のロジックは、切り取りを実行するアプリケーションによって定義されています。The key combination CTRL+X invokes the Cut command in text classes, image classes, and Web browsers, but the actual logic for performing the Cut operation is defined by the application that performs the cut. RoutedCommand では、クライアントでロジックを実装できます。A RoutedCommand enables clients to implement the logic. テキスト オブジェクトは選択されたテキストを切り取ってクリップボードに移動できるのに対し、イメージ オブジェクトは選択されたイメージを切り取ることができます。A text object may cut the selected text into the clipboard, while an image object may cut the selected image. アプリケーションは、Executed イベントを処理するときに、コマンドのターゲットにアクセスし、ターゲットの種類に応じた適切なアクションを実行できます。When an application handles the Executed event, it has access to the target of the command and can take appropriate action depending on the target's type.

WPF での簡単なコマンドの例Simple Command Example in WPF

WPFWPF でコマンドを使う最も簡単な方法は、いずれかのコマンド ライブラリ クラスの定義済みの RoutedCommand を使用するか、コマンドの処理をネイティブにサポートするコントロールを使用するか、コマンドの呼び出しをネイティブにサポートするコントロールを使用することです。The simplest way to use a command in WPFWPF is to use a predefined RoutedCommand from one of the command library classes; use a control that has native support for handling the command; and use a control that has native support for invoking a command. Paste コマンドは、ApplicationCommands クラスで定義済みのコマンドのいずれかです。The Paste command is one of the predefined commands in the ApplicationCommands class. TextBox コントロールには、Paste コマンドを処理するためのロジックが組み込まれています。The TextBox control has built in logic for handling the Paste command. MenuItem クラスはコマンドの呼び出しをネイティブにサポートします。And the MenuItem class has native support for invoking commands.

次に示すのは、TextBox にキーボード フォーカスがある場合に、クリックされたときに TextBoxPaste コマンドを呼び出すように MenuItem を設定する方法の例です。The following example shows how to set up a MenuItem so that when it is clicked it will invoke the Paste command on a TextBox, assuming the TextBox has keyboard focus.

<StackPanel>
  <Menu>
    <MenuItem Command="ApplicationCommands.Paste" />
  </Menu>
  <TextBox />
</StackPanel>
  // Creating the UI objects
  StackPanel mainStackPanel = new StackPanel();
  TextBox pasteTextBox = new TextBox();
  Menu stackPanelMenu = new Menu();
  MenuItem pasteMenuItem = new MenuItem();
 
  // Adding objects to the panel and the menu
  stackPanelMenu.Items.Add(pasteMenuItem);
  mainStackPanel.Children.Add(stackPanelMenu);
  mainStackPanel.Children.Add(pasteTextBox);

  // Setting the command to the Paste command
  pasteMenuItem.Command = ApplicationCommands.Paste;

  // Setting the command target to the TextBox
  pasteMenuItem.CommandTarget = pasteTextBox;
' Creating the UI objects
Dim mainStackPanel As New StackPanel()
Dim pasteTextBox As New TextBox()
Dim stackPanelMenu As New Menu()
Dim pasteMenuItem As New MenuItem()

' Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem)
mainStackPanel.Children.Add(stackPanelMenu)
mainStackPanel.Children.Add(pasteTextBox)

' Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste

WPF のコマンド実行における 4 つの主要な概念Four Main Concepts in WPF Commanding

WPFWPF のルーティング コマンド モデルは、コマンド、コマンド ソース、コマンド ターゲット、コマンド バインディングという 4 つの主要な概念に分けることができます。The routed command model in WPFWPF can be broken up into four main concepts: the command, the command source, the command target, and the command binding:

  • "コマンド" は、実行するアクションです。The command is the action to be executed.

  • "コマンド ソース" は、コマンドを呼び出すオブジェクトです。The command source is the object which invokes the command.

  • "コマンド ターゲット" は、コマンドが実行されているオブジェクトです。The command target is the object that the command is being executed on.

  • "コマンド バインディング" は、コマンド ロジックをコマンドにマップするオブジェクトです。The command binding is the object which maps the command logic to the command.

前の例では、Paste コマンドがコマンド、MenuItem がコマンド ソース、TextBox がコマンド ターゲットで、コマンド バインドは TextBox コントロールによって提供されます。In the previous example, the Paste command is the command, the MenuItem is the command source, the TextBox is the command target, and the command binding is supplied by the TextBox control. 注意しなければならないのは、CommandBinding はコマンド ターゲット クラスであるコントロールによって常に提供されるわけではないということです。It is worth noting that it is not always the case that the CommandBinding is supplied by the control that is the command target class. 多くの場合は、アプリケーション開発者が CommandBinding を作成する必要があるか、または CommandBinding はコマンド ターゲットの先祖に関連付けられています。Quite often the CommandBinding must be created by the application developer, or the CommandBinding might be attached to an ancestor of the command target.

コマンドCommands

WPFWPF のコマンドは、ICommand インターフェイスを実装することで作成されます。Commands in WPFWPF are created by implementing the ICommand interface. ICommand では、2 つのメソッド (ExecuteCanExecute)、およびイベント (CanExecuteChanged) を公開します。ICommand exposes two methods, Execute, and CanExecute, and an event, CanExecuteChanged. Execute では、コマンドに関連付けられているアクションを実行します。Execute performs the actions that are associated with the command. CanExecute では、現在のコマンド ターゲットでコマンドを実行できるかどうかを判断します。CanExecute determines whether the command can execute on the current command target. コマンド実行操作を集中管理するコマンド マネージャーが、既に発生しているがコマンド バインドによってまだ実行されていないコマンドを無効にする可能性のある変更をコマンド ソースで検出した場合、CanExecuteChanged が発生します。CanExecuteChanged is raised if the command manager that centralizes the commanding operations detects a change in the command source that might invalidate a command that has been raised but not yet executed by the command binding. ICommand での WPFWPF の実装は RoutedCommand クラスであり、この概要の焦点になります。The WPFWPF implementation of ICommand is the RoutedCommand class and is the focus of this overview.

WPFWPF での主な入力ソースは、マウス、キーボード、インク、およびルーティング コマンドです。The main sources of input in WPFWPF are the mouse, the keyboard, ink, and routed commands. デバイス指向性の高い入力では、RoutedEvent を使って、入力イベントが発生したことをアプリケーション ページのオブジェクトに通知します。The more device-oriented inputs use a RoutedEvent to notify objects in an application page that an input event has occurred. RoutedCommand も同様です。A RoutedCommand is no different. RoutedCommandExecute メソッドと CanExecute メソッドにはコマンドのアプリケーション ロジックは含まれませんが、これらのメソッドが発生させたルーティング イベントは、CommandBinding を含むオブジェクトに遭遇するまで、要素ツリー内をトンネリングおよびバブリングします。The Execute and CanExecute methods of a RoutedCommand do not contain the application logic for the command, but rather they raise routed events that tunnel and bubble through the element tree until they encounter an object with a CommandBinding. CommandBinding にはこれらのイベント用のハンドラーが含まれ、そのハンドラーがコマンドを実行します。The CommandBinding contains the handlers for these events and it is the handlers that perform the command. WPFWPF でのルーティング イベントについて詳しくは、「ルーティング イベントの概要」をご覧ください。For more information on event routing in WPFWPF, see Routed Events Overview.

RoutedCommandExecute メソッドは、コマンド ターゲットで PreviewExecuted イベントと Executed イベントを発生させます。The Execute method on a RoutedCommand raises the PreviewExecuted and the Executed events on the command target. RoutedCommandCanExecute メソッドは、コマンド ターゲットで CanExecute イベントと PreviewCanExecute イベントを発生させます。The CanExecute method on a RoutedCommand raises the CanExecute and PreviewCanExecute events on the command target. これらのイベントは、その特定のコマンドの CommandBinding を持つオブジェクトに遭遇するまで、要素ツリー内をトンネリングおよびバブリングします。These events tunnel and bubble through the element tree until they encounter an object which has a CommandBinding for that particular command.

WPFWPF では、MediaCommandsApplicationCommandsNavigationCommandsComponentCommandsEditingCommands などの複数のクラスにわたる共通のルーティング コマンドのセットが提供されます。supplies a set of common routed commands spread across several classes: MediaCommands, ApplicationCommands, NavigationCommands, ComponentCommands, and EditingCommands. これらのクラスは RoutedCommand オブジェクトのみで構成され、コマンドの実装ロジックは含みません。These classes consist only of the RoutedCommand objects and not the implementation logic of the command. 実装ロジックは、コマンドが実行されるオブジェクトに存在します。The implementation logic is the responsibility of the object on which the command is being executed on.

コマンド ソースCommand Sources

コマンド ソースは、コマンドを呼び出すオブジェクトです。A command source is the object which invokes the command. コマンド ソースの例は、MenuItemButtonKeyGesture などです。Examples of command sources are MenuItem, Button, and KeyGesture.

WPFWPF のコマンド ソースでは、通常、ICommandSource インターフェイスを実装します。Command sources in WPFWPF generally implement the ICommandSource interface.

ICommandSource では、CommandCommandTargetCommandParameter という 3 つのプロパティを公開します。ICommandSource exposes three properties: Command, CommandTarget, and CommandParameter:

  • Command は、コマンド ソースが呼び出されたときに実行されるコマンドです。Command is the command to execute when the command source is invoked.

  • CommandTarget は、コマンドを実行するオブジェクトです。CommandTarget is the object on which to execute the command. WPFWPF では、ICommandSourceCommandTarget プロパティは、ICommandRoutedCommand である場合にのみ適用可能であることに注意してください。It is worth noting that in WPFWPF the CommandTarget property on ICommandSource is only applicable when the ICommand is a RoutedCommand. ICommandSourceCommandTarget が設定されていて、対応するコマンドが RoutedCommand ではない場合、コマンド ターゲットは無視されます。If the CommandTarget is set on an ICommandSource and the corresponding command is not a RoutedCommand, the command target is ignored. CommandTarget が設定されていない場合は、キーボード フォーカスを持つ要素がコマンド ターゲットになります。If the CommandTarget is not set, the element with keyboard focus will be the command target.

  • CommandParameter は、コマンドを実装しているハンドラーに情報を渡すために使われるユーザー定義データ型です。CommandParameter is a user-defined data type used to pass information to the handlers implementing the command.

ICommandSource を実装する WPFWPF クラスは、ButtonBaseMenuItemHyperlinkInputBinding です。The WPFWPF classes that implement ICommandSource are ButtonBase, MenuItem, Hyperlink, and InputBinding. ButtonBaseMenuItemHyperlink は、クリックされたときにコマンドを呼び出します。InputBinding は、関連付けられている InputGesture が実行されたときにコマンドを呼び出します。ButtonBase, MenuItem, and Hyperlink invoke a command when they are clicked, and an InputBinding invokes a command when the InputGesture associated with it is performed.

次の例では、Properties コマンドのコマンド ソースとして、ContextMenuMenuItem を使用する方法を示します。The following example shows how to use a MenuItem in a ContextMenu as a command source for the Properties command.

<StackPanel>
  <StackPanel.ContextMenu>
    <ContextMenu>
      <MenuItem Command="ApplicationCommands.Properties" />
    </ContextMenu>
  </StackPanel.ContextMenu>
</StackPanel>
StackPanel cmdSourcePanel = new StackPanel();
ContextMenu cmdSourceContextMenu = new ContextMenu();
MenuItem cmdSourceMenuItem = new MenuItem();

// Add ContextMenu to the StackPanel.
cmdSourcePanel.ContextMenu = cmdSourceContextMenu;
cmdSourcePanel.ContextMenu.Items.Add(cmdSourceMenuItem);

// Associate Command with MenuItem.
cmdSourceMenuItem.Command = ApplicationCommands.Properties;
Dim cmdSourcePanel As New StackPanel()
Dim cmdSourceContextMenu As New ContextMenu()
Dim cmdSourceMenuItem As New MenuItem()

' Add ContextMenu to the StackPanel.
cmdSourcePanel.ContextMenu = cmdSourceContextMenu
cmdSourcePanel.ContextMenu.Items.Add(cmdSourceMenuItem)

' Associate Command with MenuItem.
cmdSourceMenuItem.Command = ApplicationCommands.Properties

通常、コマンド ソースは CanExecuteChanged イベントをリッスンします。Typically, a command source will listen to the CanExecuteChanged event. このイベントは、現在のコマンド ターゲットでのコマンド実行機能が変化した可能性があることを、コマンド ソースに通知します。This event informs the command source that the ability of the command to execute on the current command target may have changed. コマンド ソースは、RoutedCommand の現在の状態を、CanExecute メソッドを使って照会できます。The command source can query the current status of the RoutedCommand by using the CanExecute method. コマンドを実行できない場合、コマンド ソースはそれ自体を無効にできます。The command source can then disable itself if the command cannot execute. たとえば、コマンドを実行できない場合、MenuItem はそれ自体を灰色で表示します。An example of this is a MenuItem graying itself out when a command cannot execute.

InputGesture はコマンド ソースとして使用できます。An InputGesture can be used as a command source. WPFWPF の 2 種類の入力ジェスチャは、KeyGestureMouseGesture です。Two types of input gestures in WPFWPF are the KeyGesture and MouseGesture. KeyGesture は、Ctrl + C キーなどのキーボード ショートカットと考えることができます。You can think of a KeyGesture as a keyboard shortcut, such as CTRL+C. KeyGesture は、Key と、ModifierKeys のセットで構成されます。A KeyGesture is comprised of a Key and a set of ModifierKeys. MouseGesture は、MouseAction と、オプションの ModifierKeys のセットで構成されます。A MouseGesture is comprised of a MouseAction and an optional set of ModifierKeys.

InputGesture がコマンド ソースとして機能するためには、コマンドと関連付けられる必要があります。In order for an InputGesture to act as a command source, it must be associated with a command. これを実現するにはいくつかの方法があります。There are a few ways to accomplish this. 1 つ目は、InputBinding を使用する方法です。One way is to use an InputBinding.

KeyGestureRoutedCommand の間に KeyBinding を作成する方法の例を以下に示します。The following example shows how to create a KeyBinding between a KeyGesture and a RoutedCommand.

<Window.InputBindings>
  <KeyBinding Key="B"
              Modifiers="Control" 
              Command="ApplicationCommands.Open" />
</Window.InputBindings>
KeyGesture OpenKeyGesture = new KeyGesture(
    Key.B,
    ModifierKeys.Control);

KeyBinding OpenCmdKeybinding = new KeyBinding(
    ApplicationCommands.Open,
    OpenKeyGesture);

this.InputBindings.Add(OpenCmdKeybinding);
Dim OpenKeyGesture As New KeyGesture(Key.B, ModifierKeys.Control)

Dim OpenCmdKeybinding As New KeyBinding(ApplicationCommands.Open, OpenKeyGesture)

Me.InputBindings.Add(OpenCmdKeybinding)

InputGestureRoutedCommand に関連付けるもう 1 つの方法は、RoutedCommandInputGestureCollectionInputGesture を追加するというものです。Another way to associate an InputGesture to a RoutedCommand is to add the InputGesture to the InputGestureCollection on the RoutedCommand.

RoutedCommandInputGestureCollectionKeyGesture を追加する方法を次の例に示します。The following example shows how to add a KeyGesture to the InputGestureCollection of a RoutedCommand.

KeyGesture OpenCmdKeyGesture = new KeyGesture(
    Key.B,
    ModifierKeys.Control);

ApplicationCommands.Open.InputGestures.Add(OpenCmdKeyGesture);
Dim OpenCmdKeyGesture As New KeyGesture(Key.B, ModifierKeys.Control)

ApplicationCommands.Open.InputGestures.Add(OpenCmdKeyGesture)

CommandBindingCommandBinding

CommandBinding は、コマンドと、そのコマンドを実装するイベント ハンドラーを関連付けます。A CommandBinding associates a command with the event handlers that implement the command.

CommandBinding クラスには、Command プロパティと、PreviewExecutedExecutedPreviewCanExecuteCanExecute イベントが含まれます。The CommandBinding class contains a Command property, and PreviewExecuted, Executed, PreviewCanExecute, and CanExecute events.

Command は、CommandBinding が関連付けられているコマンドです。Command is the command that the CommandBinding is being associated with. PreviewExecuted および Executed イベントに関連付けられているイベント ハンドラーは、コマンド ロジックを実装します。The event handlers which are attached to the PreviewExecuted and Executed events implement the command logic. PreviewCanExecute および CanExecute イベントに関連付けられているイベント ハンドラーは、現在のコマンド ターゲットでコマンドを実行できるかどうかを判断します。The event handlers attached to the PreviewCanExecute and CanExecute events determine if the command can execute on the current command target.

アプリケーションのルート WindowCommandBinding を作成する方法の例を以下に示します。The following example shows how to create a CommandBinding on the root Window of an application. CommandBinding は、Open コマンドと、Executed および CanExecute ハンドラーを関連付けます。The CommandBinding associates the Open command with Executed and CanExecute handlers.

<Window.CommandBindings>
  <CommandBinding Command="ApplicationCommands.Open"
                  Executed="OpenCmdExecuted"
                  CanExecute="OpenCmdCanExecute"/>
</Window.CommandBindings>
// Creating CommandBinding and attaching an Executed and CanExecute handler
CommandBinding OpenCmdBinding = new CommandBinding(
    ApplicationCommands.Open,
    OpenCmdExecuted,
    OpenCmdCanExecute);

this.CommandBindings.Add(OpenCmdBinding);
' Creating CommandBinding and attaching an Executed and CanExecute handler
Dim OpenCmdBinding As New CommandBinding(ApplicationCommands.Open, AddressOf OpenCmdExecuted, AddressOf OpenCmdCanExecute)

Me.CommandBindings.Add(OpenCmdBinding)

次に、ExecutedRoutedEventHandlerCanExecuteRoutedEventHandler が作成されます。Next, the ExecutedRoutedEventHandler and a CanExecuteRoutedEventHandler are created. ExecutedRoutedEventHandler は、コマンドが実行されたことを知らせる文字列を表示する MessageBox を開きます。The ExecutedRoutedEventHandler opens a MessageBox that displays a string saying the command has been executed. CanExecuteRoutedEventHandler は、CanExecute プロパティを true に設定します。The CanExecuteRoutedEventHandler sets the CanExecute property to true.

void OpenCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
    String command, targetobj;
    command = ((RoutedCommand)e.Command).Name;
    targetobj = ((FrameworkElement)target).Name;
    MessageBox.Show("The " + command +  " command has been invoked on target object " + targetobj);
}
Private Sub OpenCmdExecuted(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)
    Dim command, targetobj As String
    command = CType(e.Command, RoutedCommand).Name
    targetobj = CType(sender, FrameworkElement).Name
    MessageBox.Show("The " + command + " command has been invoked on target object " + targetobj)
End Sub
void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = true;
}
Private Sub OpenCmdCanExecute(ByVal sender As Object, ByVal e As CanExecuteRoutedEventArgs)
    e.CanExecute = True
End Sub

CommandBinding は、アプリケーションやコントロールのルート Window など、特定のオブジェクトに関連付けられます。A CommandBinding is attached to a specific object, such as the root Window of the application or a control. CommandBinding が関連付けられるオブジェクトにより、バインドのスコープが定義されます。The object that the CommandBinding is attached to defines the scope of the binding. たとえば、Executed イベントは、コマンド ターゲットの先祖に関連付けられた CommandBinding には到達できますが、コマンド ターゲットの子孫に関連付けられた CommandBinding には到達できません。For example, a CommandBinding attached to an ancestor of the command target can be reached by the Executed event, but a CommandBinding attached to a descendant of the command target cannot be reached. これは、イベントを発生させたオブジェクトからの RoutedEvent のトンネリングとバブリングの方法の直接的な結果です。This is a direct consequence of the way a RoutedEvent tunnels and bubbles from the object that raises the event.

状況によっては、CommandBinding は、TextBox クラスや CutCopyPaste コマンドなど、コマンド ターゲット自体に関連付けられます。In some situations the CommandBinding is attached to the command target itself, such as with the TextBox class and the Cut, Copy, and Paste commands. ただし、ほとんどの場合は、メイン Window や Application オブジェクトなど、コマンド ターゲットの先祖に CommandBinding を関連付ける方が便利です。同じ CommandBinding を複数のコマンド ターゲットに使うことができる場合は特にそうです。Quite often though, it is more convenient to attach the CommandBinding to an ancestor of the command target, such as the main Window or the Application object, especially if the same CommandBinding can be used for multiple command targets. これらは、コマンド実行のインフラストラクチャを作成するときに考慮する設計上の決定です。These are design decisions you will want to consider when you are creating your commanding infrastructure.

コマンド ターゲットCommand Target

コマンド ターゲットは、コマンドが実行される要素です。The command target is the element on which the command is executed. RoutedCommand の場合、コマンド ターゲットは、Executed および CanExecute のルーティングが開始される要素です。With regards to a RoutedCommand, the command target is the element at which routing of the Executed and CanExecute starts. 前述のとおり、WPFWPF では、ICommandSourceCommandTarget プロパティは、ICommandRoutedCommand である場合にのみ適用されます。As noted previously, in WPFWPF the CommandTarget property on ICommandSource is only applicable when the ICommand is a RoutedCommand. ICommandSourceCommandTarget が設定されていて、対応するコマンドが RoutedCommand ではない場合、コマンド ターゲットは無視されます。If the CommandTarget is set on an ICommandSource and the corresponding command is not a RoutedCommand, the command target is ignored.

コマンド ソースは、コマンド ターゲットを明示的に設定できます。The command source can explicitly set the command target. コマンド ターゲットが定義されていない場合は、キーボード フォーカスを持つ要素がコマンド ターゲットとして使われます。If the command target is not defined, the element with keyboard focus will be used as the command target. キーボード フォーカスを持つ要素をコマンド ターゲットとして使うことの、アプリケーション開発者にとっての利点の 1 つは、コマンド ターゲットを追跡しなくても、同じコマンド ソースを使って、複数のターゲットでコマンドを呼び出すことができることです。One of the benefits of using the element with keyboard focus as the command target is that it allows the application developer to use the same command source to invoke a command on multiple targets without having to keep track of the command target. たとえば、MenuItemTextBox コントロールと PasswordBox コントロールのあるアプリケーションの貼り付けコマンドを呼び出した場合、どちらのコントロールにキーボード フォーカスがあるかに応じて、ターゲットは TextBox または PasswordBox になります。For example, if a MenuItem invokes the Paste command in an application that has a TextBox control and a PasswordBox control, the target can be either the TextBox or PasswordBox depending on which control has keyboard focus.

次の例では、マークアップおよび分離コードでコマンド ターゲットを明示的に設定する方法を示します。The following example shows how to explicitly set the command target in markup and in code behind.

<StackPanel>
  <Menu>
    <MenuItem Command="ApplicationCommands.Paste"
              CommandTarget="{Binding ElementName=mainTextBox}" />
  </Menu>
  <TextBox Name="mainTextBox"/>
</StackPanel>
  // Creating the UI objects
  StackPanel mainStackPanel = new StackPanel();
  TextBox pasteTextBox = new TextBox();
  Menu stackPanelMenu = new Menu();
  MenuItem pasteMenuItem = new MenuItem();
 
  // Adding objects to the panel and the menu
  stackPanelMenu.Items.Add(pasteMenuItem);
  mainStackPanel.Children.Add(stackPanelMenu);
  mainStackPanel.Children.Add(pasteTextBox);

  // Setting the command to the Paste command
  pasteMenuItem.Command = ApplicationCommands.Paste;

  // Setting the command target to the TextBox
  pasteMenuItem.CommandTarget = pasteTextBox;
' Creating the UI objects
Dim mainStackPanel As New StackPanel()
Dim pasteTextBox As New TextBox()
Dim stackPanelMenu As New Menu()
Dim pasteMenuItem As New MenuItem()

' Adding objects to the panel and the menu
stackPanelMenu.Items.Add(pasteMenuItem)
mainStackPanel.Children.Add(stackPanelMenu)
mainStackPanel.Children.Add(pasteTextBox)

' Setting the command to the Paste command
pasteMenuItem.Command = ApplicationCommands.Paste

CommandManagerThe CommandManager

CommandManager は、コマンドに関連する複数の関数を提供します。The CommandManager serves a number of command related functions. 特定の要素の PreviewExecutedExecutedPreviewCanExecuteCanExecute イベント ハンドラーを追加および削除するための、静的メソッドのセットを提供します。It provides a set of static methods for adding and removing PreviewExecuted, Executed, PreviewCanExecute, and CanExecute event handlers to and from a specific element. CommandBinding および InputBinding オブジェクトを特定のクラスに登録するための手段を提供します。It provides a means to register CommandBinding and InputBinding objects onto a specific class. また、CommandManager は、CanExecuteChanged イベントを発生させる必要があるタイミングをコマンドに通知する手段を、RequerySuggested イベントによって提供します。The CommandManager also provides a means, through the RequerySuggested event, to notify a command when it should raise the CanExecuteChanged event.

InvalidateRequerySuggested メソッドは、CommandManagerRequerySuggested イベントを強制的に発生させます。The InvalidateRequerySuggested method forces the CommandManager to raise the RequerySuggested event. これは、コマンドを無効または有効にする必要がある状況であっても、CommandManager がそれを認識しない場合に便利です。This is useful for conditions that should disable/enable a command but are not conditions that the CommandManager is aware of.

コマンド ライブラリCommand Library

WPFWPF には、定義済みのコマンドのセットが用意されています。provides a set of predefined commands. コマンド ライブラリは、ApplicationCommandsNavigationCommandsMediaCommandsEditingCommandsComponentCommands というクラスで構成されています。The command library consists of the following classes: ApplicationCommands, NavigationCommands, MediaCommands, EditingCommands, and the ComponentCommands. これらのクラスでは、CutBrowseBackBrowseForwardPlayStopPause などのコマンドが提供されます。These classes provide commands such as Cut, BrowseBack and BrowseForward, Play, Stop, and Pause.

これらのコマンドの多くには、既定の入力バインディングのセットが含まれます。Many of these commands include a set of default input bindings. たとえば、アプリケーションがコピー コマンドを処理することを指定すると、キーボード バインディング "Ctrl + C" が自動的に有効になります。また、Tablet PCTablet PC のペン ジェスチャや音声情報などの他の入力デバイスに対するバインディングも有効になります。For example, if you specify that your application handles the copy command, you automatically get the keyboard binding "CTRL+C" You also get bindings for other input devices, such as Tablet PCTablet PC pen gestures and speech information.

XAMLXAML を使ってさまざまなコマンド ライブラリのコマンドを参照するときは、通常、静的なコマンド プロパティを公開するライブラリ クラスのクラス名を省略できます。When you reference commands in the various command libraries using XAMLXAML, you can usually omit the class name of the library class that exposes the static command property. 一般に、コマンド名に文字列としての曖昧さはなく、所有する型は、コマンドの論理グループを提供するために存在しますが、曖昧さの解消のためには必要ありません。Generally, the command names are unambiguous as strings, and the owning types exist to provide a logical grouping of commands but are not necessary for disambiguation. たとえば、詳細な Command="ApplicationCommands.Cut" ではなくCommand="Cut" と指定できます。For instance, you can specify Command="Cut" rather than the more verbose Command="ApplicationCommands.Cut". これは、コマンドに対する WPFWPF XAMLXAML プロセッサに組み込まれた便利なメカニズムです (つまり、これは ICommand の型コンバーターの動作であり、WPFWPF XAMLXAML プロセッサは読み込み時にこれを参照します)。This is a convenience mechanism that is built in to the WPFWPF XAMLXAML processor for commands (more precisely, it is a type converter behavior of ICommand, which the WPFWPF XAMLXAML processor references at load time).

カスタム コマンドの作成Creating Custom Commands

コマンド ライブラリ クラスのコマンドがニーズを満たさない場合は、独自のコマンドを作成できます。If the commands in the command library classes do not meet your needs, then you can create your own commands. カスタム コマンドを作成するには 2 つの方法があります。There are two ways to create a custom command. 1 つは、一から始めて ICommand インターフェイスを実装する方法です。The first is to start from the ground up and implement the ICommand interface. もう 1 つのさらに一般的な方法は、RoutedCommand または RoutedUICommand を作成するものです。The other way, and the more common approach, is to create a RoutedCommand or a RoutedUICommand.

カスタムの RoutedCommand を作成する例については、「Create a Custom RoutedCommand Sample」 (カスタム RoutedCommand の作成のサンプル) を参照してください。For an example of creating a custom RoutedCommand, see Create a Custom RoutedCommand Sample.

関連項目See also