Gewusst wie: Einbinden eines Befehls in ein Steuerelement ohne Befehlsunterstützung

Im folgenden Beispiel wird veranschaulicht, wie Sie ein RoutedCommand-Objekt an ein Control-Objekt binden, in das keine Unterstützung für den Befehl integriert ist. Ein vollständiges Beispiel, das Befehle mit mehrere Quellen verknüpft, finden Sie im Beispiel unter Create a Custom RoutedCommand Sample (Erstellen eines benutzerdefinierten „RoutedCommand“-Beispiels).

Beispiel

Windows Presentation Foundation (WPF) stellt eine Bibliothek mit gängigen Befehlen bereit, die Anwendungsprogrammierer häufig nutzen. Die Befehlsbibliothek besteht aus den folgenden Klassen: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands und EditingCommands.

Die statischen RoutedCommand-Objekte, aus denen diese Klassen bestehen, bieten keine Befehlslogik. Die Logik für den Befehl wird mit dem Befehl mit einem CommandBinding in Verbindung gebracht. Viele Steuerelemente in WPF verfügen über eine integrierte Unterstützung für einige Befehle der Befehlsbibliothek. TextBox unterstützt z.B. viele Befehle zum Bearbeiten von Anwendungen (z.B. Paste, Copy, Cut, Redo und Undo). Der Anwendungsentwickler muss gar nichts Besonderes tun, um diese Befehle zum Arbeiten mit diesen Steuerelementen zu erhalten. Wenn das TextBox-Objekt bei Ausführung des Befehls das Ziel ist, wird der Befehl mit dem CommandBinding-Objekt behandelt, das in das Steuerelement integriert ist.

Im folgenden Codeausschnitt wird veranschaulicht, wie Sie ein Button-Objekt als Befehlsquelle für den Open-Befehl verwenden können. Es wird ein CommandBinding-Objekt erstellt, das die angegebenen CanExecuteRoutedEventHandler- und CanExecuteRoutedEventHandler-Objekte mit dem RoutedCommand-Objekt verknüpft.

Zunächst wird die Befehlsquelle erstellt. Ein Button-Objekt 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 CanExecuteRoutedEventHandler-Objekte erstellt. Der ExecutedRoutedEventHandler öffnet einfach ein MessageBox-Objekt, um anzugeben, dass der Befehl ausgeführt wurde. Der CanExecuteRoutedEventHandler legt die CanExecute-Eigenschaft auf true fest. Normalerweise führt der CanExecute-Handler stabilere Prüfungen durch, um festzustellen, ob der Befehl mit dem aktuellen Befehlsziel erfolgreich ausgeführt werden kann.


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

Zum Schluss wird ein CommandBinding-Objekt am Window-Stammobjekt der Anwendung erstellt, das den Routingereignishandler mit dem Open-Befehl verknüpft.

<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)

Weitere Informationen