Практическое руководство. Подключение команды к элементу управления с поддержкой команд
В следующем примере показано, как подключить RoutedCommand к Control со встроенной поддержкой команды. Полный пример подключения команд к нескольким источникам см. в примере Создание примера настраиваемой команды RoutedCommand.
Пример
Windows Presentation Foundation (WPF) предоставляет библиотеку стандартных команд, которые регулярно при программировании приложений. Классы, составляющие библиотеку команд : ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands и EditingCommands.
Статические объекты RoutedCommand, формирующие эти классы, не поддерживают командную логику. Логика команды связана с командой с CommandBinding. Некоторые элементы управления обладают встроенными привязками CommandBinding для некоторых команд. Этот механизм позволяет сохранять семантику команды даже при изменении ее фактической реализации. Так, например, класс TextBox обрабатывает команду Paste иначе, чем элемент управления, созданный для поддержки изображений, однако базовая идея вставки одного объекта в другой остается неизменной. Логика команд не может поставляться командой: ее должен поставлять элемент управления или приложение.
Многие элементы управления в WPF имеют встроенную поддержку определенных команд в библиотеке команд. TextBox, например, такие как поддерживает многие команды редактирования приложений Paste, Copy, Cut, Redo, и Undo. Разработчику приложения не нужно выполнять никаких особых действий, чтобы эти команды заработали с этими элементами управления. Если TextBox является целевым объектом команды при выполнении команды, он будет обрабатывать команду с помощью класса CommandBinding, встроенного в элемент управления.
В следующем примере показано использование MenuItem в качестве источника команды Paste, где TextBox является целевым объектом команды. Вся логика, которая определяет, как TextBox выполняет вставку, встроена в элемент управления TextBox.
Создается класс MenuItem, и в его свойстве Command задана команда Paste. Для свойства CommandTarget явным образом не задан объект TextBox. Если свойство CommandTarget не задано, целевым объектом команды будет элемент, который имеет фокус клавиатуры. Если элемент в фокусе клавиатуры не поддерживает команду Paste или не может в настоящее время выполнить команду вставки (например, буфер обмена пуст), то элемент MenuItem будет серым и недоступным для выбора.
<Window x:Class="SDKSamples.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MenuItemCommandTask"
>
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Command="ApplicationCommands.Paste" Width="75" />
</Menu>
<TextBox BorderBrush="Black" BorderThickness="2" Margin="25"
TextWrapping="Wrap">
The MenuItem will not be enabled until
this TextBox gets keyboard focus
</TextBox>
</DockPanel>
</Window>
// Window1 constructor
public Window1()
{
InitializeComponent();
// Instantiating UIElements.
DockPanel mainPanel = new DockPanel();
Menu mainMenu = new Menu();
MenuItem pasteMenuItem = new MenuItem();
TextBox mainTextBox = new TextBox();
// Associating the MenuItem with the Paste command.
pasteMenuItem.Command = ApplicationCommands.Paste;
// Setting properties on the TextBox.
mainTextBox.Text =
"The MenuItem will not be enabled until this TextBox receives keyboard focus.";
mainTextBox.Margin = new Thickness(25);
mainTextBox.BorderBrush = Brushes.Black;
mainTextBox.BorderThickness = new Thickness(2);
mainTextBox.TextWrapping = TextWrapping.Wrap;
// Attaching UIElements to the Window.
this.AddChild(mainPanel);
mainMenu.Items.Add(pasteMenuItem);
mainPanel.Children.Add(mainMenu);
mainPanel.Children.Add(mainTextBox);
// Defining DockPanel layout.
DockPanel.SetDock(mainMenu, Dock.Top);
DockPanel.SetDock(mainTextBox, Dock.Bottom);
}