Инфраструктура WPF поставляется с множеством встроенных команд, каждую из которых можно ассоциировать с соответствующей клавиатурной комбинацией (или другим входным жестом). С точки зрения программирования команда WPF — это любой объект, поддерживающий свойство (часто называемое Command
), которое возвращает объект, реализующий показанный ниже интерфейс ICommand
:
public interface ICommand
{
// Возникает, когда происходят изменения, влияющие
// на то, должна выполняться команда или нет.
event EventHandler CanExecuteChanged;
// Определяет метод, который выясняет, может ли
// команда выполняться в ее текущем состоянии.
bool CanExecute(object parameter);
// Определяет метод для вызова при обращении к команде.
void Execute(object parameter);
}
В WPF предлагаются разнообразные классы команд, которые открывают доступ к примерно сотне готовых объектов команд. В таких классах определены многочисленные свойства, представляющие специфические объекты команд, каждый из которых реализует интерфейс ICommand
. В табл. 25.3 кратко описаны избранные стандартные объекты команд.
Подключение команд к свойству Command
Для подключения любого свойства команд WPF к элементу пользовательского интерфейса, который поддерживает свойство Command
(такому как Button
или MenuItem
), потребуется проделать совсем небольшую работу. В качестве примера модифицируйте текущую систему меню, добавив новый пункт верхнего уровня по имени Edit (Правка) с тремя подэлементами, которые позволяют копировать, вставлять и вырезать текстовые данные:
BorderBrush ="Black">
MouseLeave ="MouseLeaveArea"
Click ="FileExit_Click"/>
MouseEnter ="MouseEnterToolsHintsArea"
MouseLeave ="MouseLeaveArea"
Click ="ToolsSpellingHints_Click"/>
Обратите внимание, что свойству Command
каждого подэлемента в меню Edit присвоено некоторое значение. В результате пункты меню автоматически получают корректные имена и горячие клавиши (например, <Ctrl+C> для операции вырезания) в пользовательском интерфейсе меню, и приложение теперь способно
Если вы запустите приложение и выделите какую-то часть текста, то сразу же сможете пользоваться новыми пунктами меню. Вдобавок приложение также оснащено возможностью реагирования на стандартную операцию щелчка правой кнопкой мыши, предлагая пользователю те же самые пункты в контекстном меню.
Подключение команд к произвольным действиям
Если объект команды нужно подключить к произвольному событию (специфичному для приложения), то придется прибегнуть к написанию процедурного кода. Задача несложная, но требует чуть больше логики, чем можно видеть в XAML. Например, пусть необходимо, чтобы все окно реагировало на нажатие клавиши <F1>, активизируя ассоциированную с ним справочную систему. Также предположим, что в файле кода для главного окна определен новый метод по имени SetFICommandBinding()
, который вызывается внутри конструктора после вызова InitializeComponent()
:
public MainWindow()
{
InitializeComponent();
SetF1CommandBinding();
}
Метод SetFICommandBinding()
будет программно создавать новый объект CommandBinding
, который можно применять всякий раз, когда требуется привязать объект команды к заданному обработчику событий в приложении. Сконфигурируйте объект CommandBinding
для работы с командой ApplicationCommands.Help
, которая автоматически выдается по нажатию клавиши <F1>:
private void SetF1CommandBinding()
{
CommandBinding helpBinding = new CommandBinding(ApplicationCommands.Help);
helpBinding.CanExecute += CanHelpExecute;
helpBinding.Executed += HelpExecuted;
CommandBindings.Add(helpBinding);
}