Поделиться через


Практическое руководство. Подключение команды к элементу управления, не поддерживающему команды

В следующем примере показано, как подключить 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
Button CommandButton = new Button();
CommandButton.Command = ApplicationCommands.Open;
CommandButton.Content = "Open (KeyBindings: Ctrl-R, Ctrl-0)";
MainStackPanel.Children.Add(CommandButton);
' 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)

Затем создаются объекты ExecutedRoutedEventHandler и CanExecuteRoutedEventHandler. ExecutedRoutedEventHandler просто открывает MessageBox, чтобы подтвердить выполнение команды. CanExecuteRoutedEventHandler задает для свойства CanExecute значение true. Как правило, обработчик CanExecute проводит более строгую проверку возможности выполнения команды с текущим целевым объектом команды.


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;
}


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

Наконец, создается класс CommandBinding в корневом каталоге Window приложения, который связывает обработчик перенаправленных событий с командой Open.

<Window.CommandBindings>
  <CommandBinding Command="ApplicationCommands.Open"
                  Executed="OpenCmdExecuted"
                  CanExecute="OpenCmdCanExecute"/>
</Window.CommandBindings>
// Creating CommandBinding and attaching an Executed and CanExecute handler
CommandBinding OpenCmdBinding = new CommandBinding(
    ApplicationCommands.Open,
    OpenCmdExecuted,
    OpenCmdCanExecute);

this.CommandBindings.Add(OpenCmdBinding);
' Creating CommandBinding and attaching an Executed and CanExecute handler
Dim OpenCmdBinding As New CommandBinding(ApplicationCommands.Open, AddressOf OpenCmdExecuted, AddressOf OpenCmdCanExecute)

Me.CommandBindings.Add(OpenCmdBinding)

См. также