Практическое руководство. Подключение команды к элементу управления, не поддерживающему команды
В следующем примере показано, как подключить команду RoutedCommand к элементу управления Control, в котором отсутствует встроенная поддержка команд. Полный пример, в котором команды присоединяются к нескольким источникам, см. в разделе Пример создания пользовательской команды RoutedCommand.
Пример
Windows Presentation Foundation (WPF) предоставляет библиотеку общих команд, которые регулярно используются при программировании приложений. Классы, составляющие библиотеку команд: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands и EditingCommands.
Статические объекты RoutedCommand, составляющие эти классы, не предоставляют логику команд. Логика команд связывается с командой с помощью привязки CommandBinding. Во многих элементах управления в WPF есть встроенная поддержка некоторых команд из библиотеки команд. Например, элемент управления TextBox поддерживает многие команды редактирования приложения, такие как Paste, Copy, Cut, Redo и Undo. Разработчику приложения не нужно предпринимать специальных действий для обеспечения совместимости этих команд с этими элементами управления. Если при выполнении команды элемент TextBox является целью команды, он будет обрабатывать команду с помощью привязки CommandBinding, встроенной в элемент управления.
Ниже показано, как использовать элемент управления Button в качестве источника команды для команды Open. Создается привязка CommandBinding, которая связывает указанные обработчики событий CanExecuteRoutedEventHandler и CanExecuteRoutedEventHandler с командой RoutedCommand.
Сначала создается источник команды. Элемент Button используется в качестве источника команды.
<Button Command="ApplicationCommands.Open" Name="MyButton"
Height="50" Width="200">
Open (KeyBindings: Ctrl+R, Ctrl+0)
</Button>
' Button used to invoke the command
Dim CommandButton As New Button()
CommandButton.Command = ApplicationCommands.Open
CommandButton.Content = "Open (KeyBindings: Ctrl-R, Ctrl-0)"
MainStackPanel.Children.Add(CommandButton)
// Button used to invoke the command
Button CommandButton = new Button();
CommandButton.Command = ApplicationCommands.Open;
CommandButton.Content = "Open (KeyBindings: Ctrl-R, Ctrl-0)";
MainStackPanel.Children.Add(CommandButton);
Далее создаются обработчики ExecutedRoutedEventHandler и CanExecuteRoutedEventHandler. Обработчик ExecutedRoutedEventHandler просто открывает поле MessageBox, тем самым сообщая, что команда выполнена. Обработчик CanExecuteRoutedEventHandler задает свойству CanExecute значение true. Обычно, обработчик событий CanExecute выполняет более надежные проверки для определения возможности выполнения команды для текущей цели команды.
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
Private Sub OpenCmdCanExecute(ByVal sender As Object, ByVal e As CanExecuteRoutedEventArgs)
e.CanExecute = True
End Sub
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);
}
void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
Наконец, привязка CommandBinding создается в корневом окне Window приложения, которое связывает обработчик маршрутизируемых событий с командой Open.
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Open"
Executed="OpenCmdExecuted"
CanExecute="OpenCmdCanExecute"/>
</Window.CommandBindings>
' Creating CommandBinding and attaching an Executed and CanExecute handler
Dim OpenCmdBinding As New CommandBinding(ApplicationCommands.Open, AddressOf OpenCmdExecuted, AddressOf OpenCmdCanExecute)
Me.CommandBindings.Add(OpenCmdBinding)
// Creating CommandBinding and attaching an Executed and CanExecute handler
CommandBinding OpenCmdBinding = new CommandBinding(
ApplicationCommands.Open,
OpenCmdExecuted,
OpenCmdCanExecute);
this.CommandBindings.Add(OpenCmdBinding);
См. также
Задачи
Практическое руководство. Подключение команды к элементу управления с поддержкой команды