Общие сведения о системе команд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. Первой задачей является отделение семантики и объекта, вызывающего команду, от логики, которая выполняет команду.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.

Другой целью применения команд является указание того, доступно ли действие.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 и отключаться, если CanExecute возвращает false, или включаться, если CanExecute возвращает true.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 вызывает команду Вырезать в классах текста, классах изображений и веб-браузерах, однако фактическая логика для выполнения операции Вырезать определяется приложением, которое ее выполняет.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.

Пример простой команды в WPFSimple 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.

В следующем примере показано, как настроить MenuItem так, что при его выборе вызывается команда Paste для TextBox, исходя из фокуса клавиатуры на TextBox.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

Четыре основных понятия в системе команд WPFFour Main Concepts in WPF Commanding

Модель перенаправляемых команд WPFWPF можно разбить на четыре основных понятия: команда, источник команды, цель команды и привязка команды.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 предоставляет два метода, Execute и CanExecute, и событие 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. Реализация WPFWPF класса ICommand — класс 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. Методы Execute и CanExecute класса RoutedCommand не содержат логику приложения для команды, но вызывают перенаправленные события, которые проходят и поднимаются по дереву элементов, пока не обнаружат объект с 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.

Метод Execute для RoutedCommand вызывает события PreviewExecuted и Executed для целевого объекта команды.The Execute method on a RoutedCommand raises the PreviewExecuted and the Executed events on the command target. Метод CanExecute для RoutedCommand вызывает события 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 предоставляет набор общих перенаправленных команд, которые охватывают несколько классов: MediaCommands, ApplicationCommands, NavigationCommands, ComponentCommands и EditingCommands.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. Примерами источников команды являются MenuItem, Button и KeyGesture.Examples of command sources are MenuItem, Button, and KeyGesture.

Источники команд в WPFWPF обычно реализуют интерфейс ICommandSource.Command sources in WPFWPF generally implement the ICommandSource interface.

ICommandSource предоставляет три свойства — Command, CommandTarget и CommandParameter: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 свойство CommandTarget для ICommandSource применимо, только когда ICommandRoutedCommand.It is worth noting that in WPFWPF the CommandTarget property on ICommandSource is only applicable when the ICommand is a RoutedCommand. Если для CommandTarget задано значение ICommandSource, и соответствующая команда — не 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.

Классы WPFWPF, реализующие ICommandSource: ButtonBase, MenuItem, Hyperlink и InputBinding.The WPFWPF classes that implement ICommandSource are ButtonBase, MenuItem, Hyperlink, and InputBinding. ButtonBase, MenuItem и Hyperlink вызывают команду при щелчке, а 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.

В следующем примере показано, как использовать MenuItem в ContextMenu в качестве источника команды для команды Properties.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: KeyGesture и MouseGesture.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. Один из способов — использование InputBinding.One way is to use an InputBinding.

В следующем примере показано, как создать привязку KeyBinding между KeyGesture и RoutedCommand.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)

Другой способ связать InputGesture с RoutedCommand заключается в добавлении InputGesture в InputGestureCollection для RoutedCommand.Another way to associate an InputGesture to a RoutedCommand is to add the InputGesture to the InputGestureCollection on the RoutedCommand.

В следующем примере демонстрируется, как добавить KeyGesture в InputGestureCollection для RoutedCommand.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 и события PreviewExecuted, Executed, PreviewCanExecute и CanExecute.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.

В следующем примере демонстрируется создание объекта CommandBinding в корневом объекте Window приложения.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)

Затем создаются объекты ExecutedRoutedEventHandler и CanExecuteRoutedEventHandler.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. Например, CommandBinding, присоединенный к предку целевого объекта команды, достижим для события Executed, а 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 и команд Cut, Copy и Paste.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. Довольно часто, однако, более удобным будет подключение CommandBinding к предку целевого объекта команды, такому как главное окно Window или объект приложения, особенно в том случае, если одну привязку 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 свойство CommandTarget для ICommandSource применимо, только когда ICommandRoutedCommand.As noted previously, in WPFWPF the CommandTarget property on ICommandSource is only applicable when the ICommand is a RoutedCommand. Если для CommandTarget задано значение ICommandSource, и соответствующая команда — не 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. Одно из преимуществ использования элемента с фокусом клавиатуры в качестве цели команды является то, что это позволяет разработчику приложения использовать один источник команды для вызова команд для нескольких целей без необходимости отслеживания целевого объекта команды.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. Например, если MenuItem вызывает команду Вставить в приложении, которое имеет элемент управления TextBox и элемент управления 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. Он предоставляет набор статических методов для добавления обработчиков событий PreviewExecuted, Executed, PreviewCanExecute и CanExecute в конкретный элемент и их удаления из него.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 также предоставляет средства (с помощью события RequerySuggested) для уведомления команды о необходимости вызова события CanExecuteChanged.The CommandManager also provides a means, through the RequerySuggested event, to notify a command when it should raise the CanExecuteChanged event.

Метод InvalidateRequerySuggested вынуждает CommandManager вызвать событие RequerySuggested.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. Библиотека команд включает следующие классы: ApplicationCommands, NavigationCommands, MediaCommands, EditingCommands и ComponentCommands.The command library consists of the following classes: ApplicationCommands, NavigationCommands, MediaCommands, EditingCommands, and the ComponentCommands. Эти классы предоставляют команды, такие как Cut, BrowseBack и BrowseForward, Play, Stop и Pause.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", а также получаете привязки для других устройств ввода, таких как жесты пера планшетного ПК и речевые сведения.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 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="Cut" вместо более подробной команды Command="ApplicationCommands.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. Настраиваемые команды можно создать двумя способами.There are two ways to create a custom command. Первый способ подразумевает создание с нуля и реализацию интерфейса ICommand.The first is to start from the ground up and implement the ICommand interface. Другой способ, а также наиболее распространенный подход, — создание 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