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

Aşağıdaki örnek, RoutedCommandControl komutu için yerleşik desteği olmayan bir öğesine nasıl bağlanacağını göstermektedir. Birden çok kaynağa komutları bağlayan bir örnek için, bkz. özel RoutedCommand örnek örneği oluşturma .

Örnek

Windows Presentation Foundation (WPF), uygulama programcılarının düzenli olarak karşılaştığı yaygın komutlar içeren bir kitaplık sağlar. Komut kitaplığını oluşturan sınıflar şunlardır: ApplicationCommands , ComponentCommands ,, NavigationCommandsMediaCommands ve EditingCommands .

RoutedCommandBu sınıfları oluşturan statik nesneler komut mantığı sağlamaz. Komutun mantığı, komutuyla ilişkilendirilir CommandBinding . WPF 'deki pek çok denetim, komut kitaplığındaki bazı komutlar için yerleşik desteğe sahiptir. TextBoxÖrneğin,,,, ve gibi birçok uygulama düzenleme komutunu destekler PasteCopyCutRedoUndo . Uygulama geliştiricisinin bu denetimlerle çalışmak üzere bu komutları almak için özel bir şey yapması gerekmez. Komut yürütüldüğünde komut hedefi ise, TextBoxCommandBinding denetimde yerleşik olan öğesini kullanarak komutu işler.

Aşağıda Button komut için komut kaynağı olarak nasıl kullanılacağı gösterilmektedir Open . , CommandBinding İle belirtilen ve ile ilişkilendiren bir oluşturulur CanExecuteRoutedEventHandlerCanExecuteRoutedEventHandlerRoutedCommand .

İlk olarak, komut kaynağı oluşturulur. ButtonKomut 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)

Ardından, ExecutedRoutedEventHandler ve CanExecuteRoutedEventHandler oluşturulur. ExecutedRoutedEventHandlerMessageBox Komutun yürütüldüğünü belirtmek için yalnızca bir açar. , CanExecuteRoutedEventHandlerCanExecute Özelliğini olarak ayarlar true . Normal olarak, işlem, komutun geçerli komut hedefinde yürütülüp yürütülmeyeceğ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, bir CommandBinding uygulamanın kökünde, Window yönlendirilmiş olaylar işleyicilerini komutuyla ilişkilendiren bir oluşturulur 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)

Ayrıca bkz.