Como enganchar um comando em um controle sem suporte de comando

O exemplo a seguir mostra como conectar um RoutedCommand a um Control que não tem o suporte interno para o comando. Para ver um exemplo completo que interliga comandos a várias fontes, consulte o exemplo Criar um exemplo de RoutedCommand personalizado.

Exemplo

O Windows Presentation Foundation (WPF) fornece uma biblioteca de comandos comuns que os programadores de aplicativos encontram regularmente. As classes que compõem a biblioteca de comandos são: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands e EditingCommands.

Os objetos RoutedCommand estáticos que compõem essas classes não fornecem a lógica de comando. A lógica para o comando está associada ao comando com uma CommandBinding. Muitos controles no WPF têm suporte interno para alguns dos comandos na biblioteca de comandos. TextBox, por exemplo, dá suporte a muitos dos comandos de edição de aplicativo, como Paste, Copy, Cut, Redo e Undo. O desenvolvedor do aplicativo não precisa fazer nada especial para fazer com que esses comandos funcionem com esses controles. Se a TextBox for o destino de comando quando o comando for executado, ela manipulará o comando usando a CommandBinding interna do controle.

O exemplo a seguir mostra como usar um Button como a origem de comando para o comando Open. Uma CommandBinding é criada, que associa o CanExecuteRoutedEventHandler especificado e o CanExecuteRoutedEventHandler ao RoutedCommand.

Primeiro, a fonte de comando é criada. Um Button é usado como a origem de comando.

<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)

Em seguida, o ExecutedRoutedEventHandler e o CanExecuteRoutedEventHandler são criados. O ExecutedRoutedEventHandler apenas abre uma MessageBox para indicar que o comando foi executado. O CanExecuteRoutedEventHandler define a propriedade CanExecute como true. Normalmente, o manipulador realizaria verificações mais robustas para ver se o comando pode ser executado no destino do comando atual.


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

Por fim, uma CommandBinding é criada na Window raiz do aplicativo que associa os manipuladores de eventos roteados ao comando 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)

Confira também