Udostępnij za pośrednictwem


Jak podłączyć polecenie do elementu sterującego, który nie obsługuje poleceń

W poniższym przykładzie pokazano, jak podłączyć RoutedCommand z Control, który nie ma wbudowanej obsługi tego polecenia. Aby zapoznać się z kompletnym przykładem, który podłącza polecenia do wielu źródeł, zobacz przykład Create a Custom RoutedCommand Sample.

Przykład

Program Windows Presentation Foundation (WPF) udostępnia bibliotekę typowych poleceń, które programisty aplikacji napotykają regularnie. Klasy składające się z biblioteki poleceń to: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommandsi EditingCommands.

Statyczne obiekty RoutedCommand tworzące te klasy nie dostarczają logiki poleceń. Logika polecenia jest skojarzona z poleceniem z CommandBinding. Wiele kontrolek w WPF ma wbudowaną obsługę niektórych poleceń w bibliotece poleceń. TextBox, na przykład obsługuje wiele poleceń edycji aplikacji, takich jak Paste, Copy, Cut, Redoi Undo. Deweloper aplikacji nie musi wykonywać żadnych specjalnych czynności, aby te polecenia działały z tymi kontrolkami. Jeśli TextBox jest obiektem docelowym polecenia podczas wykonywania polecenia, będzie obsługiwać polecenie przy użyciu CommandBinding wbudowanego w kontrolkę.

Poniżej przedstawiono sposób użycia Button jako źródła poleceń dla polecenia Open. Zostaje utworzony CommandBinding, który łączy określone CanExecuteRoutedEventHandler i CanExecuteRoutedEventHandler z RoutedCommand.

Najpierw jest tworzone źródło polecenia. Button jest używany jako źródło polecenia.

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

Następnie zostaną utworzone ExecutedRoutedEventHandler i CanExecuteRoutedEventHandler. ExecutedRoutedEventHandler po prostu otwiera MessageBox, aby oznaczyć, że polecenie zostało wykonane. CanExecuteRoutedEventHandler ustawia właściwość CanExecute na wartość true. Zwykle program obsługi może wykonywać bardziej niezawodne kontrole, aby sprawdzić, czy polecenie może zostać wykonane na bieżącym obiekcie docelowym polecenia.


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

Na koniec na Window aplikacji zostanie utworzona CommandBinding, która kojarzy obsługiwacze zdarzeń routowalnych z poleceniem 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)

Zobacz też