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


Как привязать команду к элементу управления без поддержки командного интерфейса

В следующем примере показано, как подключить 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. Как правило, обработчик может выполнять более надежные проверки, чтобы узнать, может ли команда выполняться в текущем целевом объекте команды.


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)

См. также