Compartir a través de


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

En el ejemplo siguiente se muestra cómo enlazar RoutedCommand a un objeto Control que no tiene compatibilidad integrada para el comando. Para obtener un ejemplo completo que enlaza comandos a varios orígenes, vea el ejemplo Create a Custom RoutedCommand Sample.

Ejemplo

Windows Presentation Foundation (WPF) proporciona una biblioteca de comandos comunes que los programadores de aplicaciones suelen utilizar. Las clases que componen 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 de los comandos. La lógica del comando se asocia al comando mediante CommandBinding. Muchos controles de WPF tienen compatibilidad integrada con algunos de los comandos de la biblioteca de comandos. Por ejemplo, TextBox admite muchos de los comandos de edición de aplicación, tales como Paste, Copy, Cut, Redo y Undo. El programador de aplicaciones no tiene que hacer nada especial para que estos comandos funcionen con estos controles. Si el control TextBox es el destino del comando al ejecutar éste último, administrará el comando mediante el objeto CommandBinding integrado en el control.

A continuación se muestra cómo utilizar un control Button como origen de comando del comando Open. Se crea un objeto CommandBinding que asocia el controlador CanExecuteRoutedEventHandler especificado, y CanExecuteRoutedEventHandler a RoutedCommand.

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

A continuación, se crean ExecutedRoutedEventHandler y CanExecuteRoutedEventHandler. El controlador ExecutedRoutedEventHandler abre un MessageBox para indicar que se ejecutó el comando. CanExecuteRoutedEventHandler establece la propiedad CanExecute en true. Normalmente, el controlador de posibilidad de ejecución realizaría comprobaciones más robustas para ver si el comando se pudo ejecutar en el destino de comando actual.


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

Por último, se crea un objeto CommandBinding en el elemento Window raíz de la aplicación que asocia 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
            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);

Vea también

Tareas

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

Conceptos

Información general sobre comandos