Como ligar um comando a um controlo sem suporte para comandos
O exemplo a seguir mostra como conectar um RoutedCommand a um Control que não tem suporte interno para o comando. Para obter um exemplo completo que conecta comandos a várias fontes, consulte o Criar um exemplo de RoutedCommand personalizado exemplo.
Exemplo
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, MediaCommandse EditingCommands.
Os objetos RoutedCommand estáticos que compõem essas classes não fornecem lógica de comando. A lógica do comando está associada ao comando com um CommandBinding. Muitos controles no WPF têm suporte interno para alguns dos comandos na biblioteca de comandos. TextBox, por exemplo, suporta muitos dos comandos de edição do aplicativo, como Paste, Copy, Cut, Redoe Undo. O desenvolvedor do aplicativo não precisa fazer nada de especial para que esses comandos funcionem com esses controles. Se o TextBox for o destino do comando quando o comando for executado, ele manipulará o comando usando o CommandBinding incorporado ao controle.
A seguir mostra como usar um Button como a fonte de comando para o comando Open. É criado um CommandBinding que associa o CanExecuteRoutedEventHandler especificado e o CanExecuteRoutedEventHandler ao RoutedCommand.
Primeiro, a fonte de comando é criada. Um Button é usado como fonte 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 simplesmente abre um MessageBox para indicar que o comando foi executado. O CanExecuteRoutedEventHandler define a propriedade CanExecute como true
. Normalmente, o manipulador "can execute" realizaria verificações mais robustas para determinar se o comando pode ser executado no destino de 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
Finalmente, um CommandBinding é criado 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)
Ver também
.NET Desktop feedback