Aracılığıyla paylaş


Nasıl yapılır: Komut Desteği Olmadan Denetime Komut Bağlama

Aşağıdaki örnekte komutu için yerleşik desteği olmayan bir'e RoutedCommandControl nasıl bağlanıldığı gösterilmektedir. Komutları birden çok kaynağa bağlayan eksiksiz bir örnek için Bkz . Özel Yönlendirilmiş Komut Örneği Oluşturma.

Örnek

Windows Presentation Foundation (WPF), uygulama programcıların düzenli olarak karşılaştığı yaygın komutlardan oluşan bir kitaplık sağlar. Komut kitaplığını oluşturan sınıflar şunlardır: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommandsve EditingCommands.

Bu sınıfları oluşturan statik RoutedCommand nesneler komut mantığı sağlamaz. komutunun mantığı komutuyla CommandBindingilişkilendirilir. WPF'deki birçok denetim, komut kitaplığındaki bazı komutlar için yerleşik destek sağlar. TextBox, örneğin, , , Copy, CutRedove Undogibi Pasteuygulama düzenleme komutlarının çoğunu destekler. Uygulama geliştiricisinin bu denetimlerle çalışmak için bu komutları almak için özel bir şey yapması gerekmez. TextBox komutu yürütülürken komut hedefi ise, denetimin yerleşik öğesini kullanarak CommandBinding komutu işler.

Aşağıda komutun komut kaynağı olarak nasıl Button kullanılacağı gösterilmektedir Open . CommandBinding belirtilen CanExecuteRoutedEventHandler ve CanExecuteRoutedEventHandler ile RoutedCommandilişkilendiren bir oluşturulur.

İlk olarak, komut kaynağı oluşturulur. A Button , komut kaynağı olarak kullanılır.

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

ExecutedRoutedEventHandler Ardından ve CanExecuteRoutedEventHandler oluşturulur. basitçe ExecutedRoutedEventHandler komutun yürütüldüğünü belirten bir MessageBox açar. CanExecuteRoutedEventHandler özelliğini olarak CanExecutetrueayarlar. Normalde, can execute işleyicisi komutun geçerli komut hedefinde yürütülip yürütülemediğini görmek için daha güçlü denetimler gerçekleştirir.


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

Son olarak, yönlendirilen olay işleyicilerini komutuyla ilişkilendiren uygulamanın kökünde WindowOpen bir CommandBinding oluşturulur.

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

Ayrıca bkz.