Присоединение команды к источнику
Чтобы команда работала, ее нужно присоединить к свойству Command источника команды. Источников, к которым присоединена одна и та же команда, может быть несколько. Элементы, к которым можно присоединить команду, должны наследовать интерфейс ICommandSource. Только такие элементы будут иметь свойство Command. Этих элементов в WPF немного и все они показаны на рисунке
Интерфейс ICommandSource реализует свои свойства в ближайших наследниках ButtonBase, Hyperlink, InputBinding, MenuItem по общему синтаксису:
public System.Windows.Input.ICommand Command { get; set; } public object CommandParameter { get; set; } public System.Windows.IInputElement CommandTarget { get; set; }В источнике для присоединения команды достаточно присвоить значение только ссылке Command на объект команды (на экземпляр RoutedCommand или RoutedUICommand ). Остальные свойства являются необязательными и служат для уточнения команды:
- CommandParameter - тип данных, определяемый пользователем, который используется для передачи информации обработчикам, реализующим команду
- CommandTarget - идентифицирует элемент, в котором должна выполняться данная команда. Если значение свойства CommandTarget не задано, в качестве цели команды используется элемент, в котором установлен фокус ввода
Обратите внимание, что два наследуемые источниками команд свойства-ссылки Command и CommandTarget имеют типы интерфейсов, что позволяет адресовать любые команды и целевые элементы, наследующие эти интерфейсы.
Вот, например, как можно присоединить команду Paste к элементу меню в разметке
<StackPanel> <Menu Header="Edit"> <MenuItem Command="ApplicationCommands.Paste" /> </Menu> <TextBox /></StackPanel>Для библиотечных команд синтаксис разметки допускает использование сокращенной записи, например
<StackPanel> <Menu Header="Edit"> <MenuItem Command="Paste" /> </Menu> <TextBox /></StackPanel>Теперь, если объект TextBox имеет фокус ввода и буфер обмена содержит текст, то при выборе пользователем этого пункта меню текст из буфера будет вставлен в элемент TextBox. Обратите внимание, что объект MenuItem не устанавливает свойство Header для отображения в нем названия команды Paste. Если свойство для текста названия команды в источнике опущено, то источник способен сам извлекать эту информацию из объекта присоединенной команды.
А вот альтернативный вариант присоединения команды Paste к элементу меню в процедурном коде
// Создание объектов пользовательского интерфейсаStackPanel mainStackPanel = new StackPanel();TextBox pasteTextBox = new TextBox();Menu stackPanelMenu = new Menu();MenuItem pasteMenuItem = new MenuItem(); // Добавление объектов в коллекции панели и менюstackPanelMenu.Items.Add(pasteMenuItem);mainStackPanel.Children.Add(stackPanelMenu);mainStackPanel.Children.Add(pasteTextBox); // Присоединение библиотечной команды Paste к источнику командpasteMenuItem.Command = ApplicationCommands.Paste;Аналогичный пример можно привести для присоединения команды к контекстному меню.
<StackPanel> <StackPanel.ContextMenu> <ContextMenu> <MenuItem Command="ApplicationCommands.Paste" /> </ContextMenu> </StackPanel.ContextMenu></StackPanel>// Создание объектов пользовательского интерфейсаStackPanel cmdSourcePanel = new StackPanel();ContextMenu cmdSourceContextMenu = new ContextMenu();MenuItem cmdSourceMenuItem = new MenuItem(); // Добавление ContextMenu в StackPanelcmdSourcePanel.ContextMenu = cmdSourceContextMenu;cmdSourcePanel.ContextMenu.Items.Add(cmdSourceMenuItem); // Присоединение библиотечной команды Paste к источнику командcmdSourceMenuItem.Command = ApplicationCommands.Paste;Дата добавления: 2015-04-15; просмотров: 732;