Gewusst wie: Einbinden eines Befehls in ein Steuerelement ohne Befehlsunterstützung
Das folgende Beispiel zeigt, wie Sie einen RoutedCommand in ein Control einbinden, das nicht über eine integrierte Unterstützung für den Befehl verfügt. Ein vollständiges Beispiel, in dem Befehle in mehrere Quellen eingebunden werden, finden Sie unter Beispiel für das Erstellen eines benutzerdefinierten "RoutedCommand".
Beispiel
Windows Presentation Foundation (WPF) stellt eine Bibliothek mit allgemeinen Befehlen bereit, die Anwendungsprogrammierer häufig nutzen. Die Befehlsbibliothek enthält die folgenden Klassen: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands und EditingCommands.
Die statischen RoutedCommand-Objekte, aus denen diese Klassen bestehen, stellen keine Befehlslogik bereit. Die Logik für den Befehl wird dem Befehl mithilfe von CommandBinding bereitgestellt. Viele Steuerelemente in WPF verfügen über eine integrierte Unterstützung für einige Befehle der Befehlsbibliothek. TextBox unterstützt zum Beispiel viele Bearbeitungsbefehle der Anwendung, wie Paste, Copy, Cut, Redo und Undo. Anwendungsentwickler müssen keine speziellen Schritte ausführen, damit diese Befehle mit diesen Steuerelementen funktionieren. Wenn das TextBox das Befehlsziel ist, wenn der Befehl ausgeführt wird, behandelt es den Befehl mithilfe des CommandBinding-Elements, das in das Steuerelement integriert ist.
Das folgende Beispiel zeigt, wie Sie ein Button als Befehlsquelle für den Open-Befehl verwenden. Eine CommandBinding wird erstellt, die dem RoutedCommand die angegebenen CanExecuteRoutedEventHandler und CanExecuteRoutedEventHandler zuordnet.
Zuerst wird die Befehlsquelle erstellt. Eine 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
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);
Anschließend werden ExecutedRoutedEventHandler und CanExecuteRoutedEventHandler erstellt. ExecutedRoutedEventHandler öffnet einfach ein MessageBox, um die Ausführung des Befehls zu kennzeichnen. Der CanExecuteRoutedEventHandler setzt die CanExecute-Eigenschaft auf true. Normalerweise nimmt der CanExecute-Handler gründlichere Überprüfungen vor, um festzustellen, ob der Befehl für das aktuelle Befehlsziel ausgeführt werden konnte.
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;
}
Schließlich wird eine CommandBinding für das Stamm-Window der Anwendung erstellt, die die Routingereignishandler dem Open zuordnet.
<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);
Siehe auch
Aufgaben
Gewusst wie: Einbinden eines Befehls in ein Steuerelement mit Befehlsunterstützung