каждого подэлемента в меню 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);
}
Большинство
объектов
CommandBinding
будет обрабатывать событие
CanExecute
(которое позволяет указать, инициируется ли команда для конкретной операции программы) и событие
Executed
(где можно определить код, подлежащий выполнению после того, как команда произошла). Добавьте к типу, производному от
Window
, следующие обработчики событий (форматы методов регламентируются ассоциированными делегатами):
MessageBox.Show("Look, it is not that difficult. Just type something!",
"Help!");
}
В предыдущем фрагменте кода метод
CanHelpExecute
реализован так, что справка по нажатию <
F1
> всегда разрешена; это делается путем возвращения
true
. Однако если в определенных ситуациях справочная система отображаться не должна, то необходимо предпринять соответствующую проверку и возвращать
false
. Созданная "справочная система", отображаемая внутри
HelpExecute
, представляет собой всего лишь обычное окно сообщения. Теперь можете запустить приложение. После нажатия <F1> появится ваше окно сообщения.
Работа с командами Open и Save
Чтобы завершить текущий пример, вы добавите функциональность сохранения текстовых данных во внешнем файле и открытия файлов
*.txt
для редактирования. Можно пойти длинным путем, вручную добавив программную логику, которая включает и отключает пункты меню в зависимости от того, имеются ли данные внутри
TextBox
. Тем не менее, для сокращения усилий можно прибегнуть к услугам команд.
Начните с обновления элемента
MenuItem
, который представляет меню File верхнего уровня, путем добавления двух новых подменю, использующих объекты
Вспомните, что все объекты команд реализуют интерфейс
ICommand
, в котором определены два события (
CanExecute
и
Executed
). Теперь необходимо разрешить окну выполнять указанные команды, предварительно проверив возможность делать это в текущих обстоятельствах; раз так, можете определить обработчик события для запуска специального кода.