Procedura: Associare un comando a un controllo senza supporto comandi
Nell'esempio seguente viene illustrato come associare un RoutedCommand a un Control che non dispone del supporto predefinito per il comando . Per un esempio completo che collega i comandi a più origini, vedere l'esempio Creare un esempio di routedCommand personalizzato.
Esempio
Windows Presentation Foundation (WPF) fornisce una libreria di comandi comuni che i programmatori di applicazioni riscontrano regolarmente. Le classi che costituiscono la libreria dei comandi sono: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommandse EditingCommands.
Gli oggetti statici RoutedCommand che costituiscono queste classi non forniscono logica di comando. La logica per il comando è associata al comando con un CommandBinding. Molti controlli in WPF includono il supporto integrato per alcuni comandi specifici della libreria dei comandi. TextBox, ad esempio, supporta molti comandi di modifica dell'applicazione, ad esempio Paste, Copy, Cut, Redoe Undo. Lo sviluppatore di applicazioni non deve eseguire alcuna operazione speciale per ottenere questi comandi per lavorare con questi controlli. Se il TextBox è la destinazione del comando quando viene eseguito il comando, gestirà il comando usando il CommandBinding integrato nel controllo .
Di seguito viene illustrato come usare un Button come origine del comando per il comando Open. Viene creato un CommandBinding che associa il CanExecuteRoutedEventHandler specificato e il CanExecuteRoutedEventHandler al RoutedCommand.
Prima di tutto, viene creata l'origine del comando. Un Button viene utilizzato come sorgente 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)
Vengono quindi creati i ExecutedRoutedEventHandler e i CanExecuteRoutedEventHandler. Il ExecutedRoutedEventHandler apre semplicemente un MessageBox per indicare che il comando è stato eseguito. Il CanExecuteRoutedEventHandler imposta la proprietà CanExecute su true
. In genere, il gestore esecutore normalmente eseguirebbe controlli più robusti per verificare se il comando potrebbe essere eseguito sull'obiettivo del comando attuale.
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
Infine, viene creato un CommandBinding alla radice Window dell'applicazione che associa i gestori degli eventi instradati 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)
Vedere anche
.NET Desktop feedback