Delen via


Procedure: Een opdracht koppelen aan een besturingselement zonder ondersteuning voor opdrachten

In het volgende voorbeeld ziet u hoe u een RoutedCommand koppelt aan een Control die geen ingebouwde ondersteuning voor de opdracht heeft. Zie het Voorbeeld voor het maken van een Aangepaste RoutedCommand voor een compleet voorbeeld dat commando's koppelt aan meerdere bronnen.

Voorbeeld

Windows Presentation Foundation (WPF) biedt een bibliotheek met algemene opdrachten die programmeurs van toepassingen regelmatig tegenkomen. De klassen die bestaan uit de opdrachtbibliotheek zijn: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommandsen EditingCommands.

De statische RoutedCommand objecten waaruit deze klassen bestaan, leveren geen opdrachtlogica op. De logica voor de opdracht is gekoppeld aan de opdracht met een CommandBinding. Veel besturingselementen in WPF hebben ingebouwde ondersteuning voor sommige van de opdrachten in de opdrachtbibliotheek. TextBoxondersteunt bijvoorbeeld veel opdrachten voor het bewerken van toepassingen, zoals Paste, Copy, Cut, Redoen Undo. De toepassingsontwikkelaar hoeft niets speciaals te doen om deze opdrachten te laten werken met deze besturingselementen. Als het TextBox het opdrachtdoel is wanneer de opdracht wordt uitgevoerd, wordt de opdracht afgehandeld met behulp van de CommandBinding die is ingebouwd in het besturingselement.

Hieronder ziet u hoe u een Button gebruikt als de opdrachtbron voor de Open opdracht. Er wordt een CommandBinding gemaakt die de opgegeven CanExecuteRoutedEventHandler en de CanExecuteRoutedEventHandler koppelt aan de RoutedCommand.

Eerst wordt de opdrachtbron gemaakt. Een Button wordt gebruikt als opdrachtbron.

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

Vervolgens worden de ExecutedRoutedEventHandler en de CanExecuteRoutedEventHandler gemaakt. De ExecutedRoutedEventHandler opent gewoon een MessageBox om aan te geven dat de opdracht is uitgevoerd. De CanExecuteRoutedEventHandler stelt de eigenschap CanExecute in op true. Normaal gesproken zou de can-execute-handler uitgebreidere controles uitvoeren om te bepalen of de opdracht op de huidige doellocatie kan worden uitgevoerd.


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

Ten slotte wordt er een CommandBinding aangemaakt op de root Window van de applicatie, die de gerouteerde gebeurtenishandlers koppelt aan het commando 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)

Zie ook