WPF两个命令处理程序,一个命令

时间:2010-03-15 04:36:26

标签: wpf command routed-commands commandbinding

我来自第三方控制。它正在实现ApplicationCommands.SelectAll。但是我想要的行为略有不同。没有我可以覆盖的虚方法,当我注册类处理程序时,就像这样

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

我的方法不会被调用。我得出的第三方控件是标记

e.Handled=true;

在它的命令处理程序中(我知道这个原因我已经看到了源代码,但我无法修改它)

我该怎么办?

1 个答案:

答案 0 :(得分:6)

您有三种选择:

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

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

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

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

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

这不是类处理程序,因此您需要为每个实例执行此操作。然后在你的处理程序中你需要检查天气这是你感兴趣的命令(在事件args中有一个对命令的引用)。注意:您仍然需要注册CommandBinding,但如果您只想在CommandManager上直接添加处理程序 - 您不需要使用该命令绑定注册任何处理程序。

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

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

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