Vorgehensweise: Verbinden eines Befehls mit einem Steuerelement ohne Befehlsunterstützung
Das folgende Beispiel zeigt, wie Sie eine RoutedCommand mit einer Control verbinden, die keine eingebaute Unterstützung für den Befehl hat. Ein vollständiges Beispiel, das Befehle mit mehreren Quellen verknüpft, finden Sie im Erstellen eines benutzerdefinierten RoutedCommand-Beispiels Beispiel.
Beispiel
Windows Presentation Foundation (WPF) stellt eine Bibliothek allgemeiner Befehle bereit, auf die Anwendungsprogrammierer regelmäßig stoßen. Die Klassen, aus denen die Befehlsbibliothek besteht, sind: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommandsund EditingCommands.
Die statischen RoutedCommand Objekte, aus denen diese Klassen bestehen, geben keine Befehlslogik an. Die Logik des Befehls ist dem Befehl mit einem CommandBindingzugeordnet. Viele Steuerelemente in WPF verfügen über integrierte Unterstützung für einige der Befehle, die die Befehlsbibliothek beinhaltet. TextBoxunterstützt beispielsweise viele der Anwendungsbearbeitungsbefehle wie Paste, Copy, Cut, Redound Undo. Der Anwendungsentwickler muss nichts Besonderes tun, um diese Befehle für die Arbeit mit diesen Steuerelementen zu erhalten. Wenn die TextBox das Befehlsziel ist, wenn der Befehl ausgeführt wird, verarbeitet er den Befehl mithilfe der CommandBinding, die in das Steuerelement integriert ist.
Im Folgenden wird gezeigt, wie Sie eine Button als Befehlsquelle für den Befehl Open verwenden. Es wird eine CommandBinding erstellt, die die angegebene CanExecuteRoutedEventHandler und die CanExecuteRoutedEventHandler mit dem RoutedCommandverknüpft.
Zuerst wird die Befehlsquelle erstellt. Ein Button wird als Befehlsquelle verwendet.
<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)
Als Nächstes werden die ExecutedRoutedEventHandler und die CanExecuteRoutedEventHandler erstellt. Die ExecutedRoutedEventHandler öffnet einfach eine MessageBox, um anzuzeigen, dass der Befehl ausgeführt wurde. Die CanExecuteRoutedEventHandler legt die CanExecute-Eigenschaft auf true
fest. Normalerweise führt der Ausführungs-Handler robustere Prüfungen durch, um festzustellen, ob der Befehl am aktuellen Befehlsziel ausführbar ist.
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
Schließlich wird eine CommandBinding im Stamm-Window der Anwendung erstellt, die den Routingereignishandlern dem Open-Befehl zuordnet.
<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)
Siehe auch
.NET Desktop feedback