Cómo: Enlazar un comando a un control sin la compatibilidad de comandos

En el ejemplo siguiente se muestra cómo enlazar un RoutedCommand a un Control que no tiene compatibilidad integrada para el comando. Para obtener un ejemplo completo que enlace comandos a varios orígenes, consulte el ejemplo Crear un objeto RoutedCommand personalizado.

Ejemplo

Windows Presentation Foundation (WPF) proporciona una biblioteca de comandos comunes que los programadores de aplicaciones usan con regularidad. Las clases que constituyen la biblioteca de comandos son: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands y EditingCommands.

Los objetos RoutedCommand estáticos que componen estas clases no proporcionan la lógica del comando. La lógica del comando está asociada al comando con un objeto CommandBinding. Muchos de los controles de Windows Presentation Foundation (WPF) tienen compatibilidad integrada para algunos de los comandos de la biblioteca de comandos. TextBox, por ejemplo, admite muchos de los comandos de edición de la aplicación, como Paste, Copy, Cut, Redo y Undo. El desarrollador de aplicaciones no tiene que hacer nada especial para que estos comandos funcionen con estos controles. Si TextBox es el destino del comando cuando se ejecuta el comando, controlará el comando mediante el CommandBinding que está integrado en el control.

A continuación se muestra cómo usar un Button como origen para el comando Open. Se crea un CommandBinding que asocia los controladores CanExecuteRoutedEventHandler y CanExecuteRoutedEventHandler especificados con el RoutedCommand.

En primer lugar, se crea el origen del comando. Button se utiliza como el origen del 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)

Después, se crean ExecutedRoutedEventHandler y CanExecuteRoutedEventHandler. ExecutedRoutedEventHandler simplemente abre MessageBox para indicar que se ejecutó el comando. CanExecuteRoutedEventHandler establece la propiedad CanExecute en true. Normalmente, el controlador can execute realizaría comprobaciones más completas para ver si el comando puede ejecutarse en el destino del comando actual.


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 último, se crea CommandBinding en la raíz Window de la aplicación para asociar los controladores de eventos enrutados al 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)

Vea también