2010-03-15 77 views
4

来自第三方控件的Im。它正在实现ApplicationCommands.SelectAll。但是我想要的行为稍有不同。有没有虚拟的方法我可以覆盖,当我注册一个类处理程序,像这样WPF两个命令处理程序,一个命令

 CommandManager.RegisterClassCommandBinding(typeof(MyDerivedControl), new CommandBinding(ApplicationCommands.SelectAll, new ExecutedRoutedEventHandler(OnExecutedSelectAll), new CanExecuteRoutedEventHandler(OnCanExecuteSelectAll))); 

我的方法不会被调用。第三方控制我从获得的标记

e.Handled=true;

在它的命令处理程序(我知道这因为我已经看到了源,但我不能修改)

我能做些什么?

回答

6

你有三个选择:

1)您可以注册您的CommandBinding处理预览事件,而不是或除了常规的事件:

CommandBinding cb = new CommandBinding(ApplicationCommands.SelectAll); 
cb.PreviewCanExecute += OnCanExecuteSelectAll; 
cb.PreviewExecuted += OnExecutedSelectAll; 

但要小心 - 通过的CommandBinding注册处理程序时,如果你具有PreviewExecuted注册,即使您明确地将e.Handled设置为false,Executed处理程序也不会运行。它确实按照预期的方式为PreviewCanExecute/CanExecute事件对工作。这是CommandBinding类实现的方式。
因此,仅当您不希望基类命令处理程序运行时才使用PreviewExecuted。

2)或者,您也可以直接通过命令管理器注册您的命令处理程序:

CommandManager.AddPreviewCanExecuteHandler(this, OnCanExecuteSelectAll); 
CommandManager.AddPreviewExecutedHandler(this, OnExecutedSelectAll); 

这是不是一类的处理程序,但这样你需要做的是为每个实例。然后在你的处理程序中,你需要检查天气这是你感兴趣的命令(在事件参数中有一个对命令的引用)。注意:你仍然需要注册CommandBinding,但是如果你只想在CommandManager上直接添加处理程序 - 你不需要使用那个Command Binding来注册任何处理程序。

3),或者你可以做一个黑客攻击的一位(不是一个真正的黑客):

this.AddHandler(CommandManager.CanExecuteEvent, new CanExecuteRoutedEventHandler(OnCanExecuteSelectAll), true); 
this.AddHandler(CommandManager.ExecutedEvent, new ExecutedRoutedEventHandler(OnExecutedSelectAll), true); 

这样您注册指挥事件处理程序,使他们即使他们已经处理被执行。
与上面一样,您需要注册命令绑定,才能触发CommandManager事件。
这几乎与上面第2点中的相同,但是当您调用CommandManager.Add [四个事件之一] Handler时 - 命令管理器使用两个参数版本在控件上调用AddHandler。