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
.NET Desktop feedback