我来自第三方控制。它正在实现ApplicationCommands.SelectAll。但是我想要的行为略有不同。没有我可以覆盖的虚方法,当我注册类处理程序时,就像这样
CommandManager.RegisterClassCommandBinding(typeof(MyDerivedControl), new CommandBinding(ApplicationCommands.SelectAll, new ExecutedRoutedEventHandler(OnExecutedSelectAll), new CanExecuteRoutedEventHandler(OnCanExecuteSelectAll)));
我的方法不会被调用。我得出的第三方控件是标记
e.Handled=true;
在它的命令处理程序中(我知道这个原因我已经看到了源代码,但我无法修改它)
我该怎么办?
答案 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。