Freigeben über


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 truefest. 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