Ara*_*and 4 wpf command routed-commands commandbinding
我来自第三方控制.它正在实现ApplicationCommands.SelectAll.但是我想要的行为略有不同.没有我可以覆盖的虚方法,当我注册类处理程序时,就像这样
CommandManager.RegisterClassCommandBinding(typeof(MyDerivedControl), new CommandBinding(ApplicationCommands.SelectAll, new ExecutedRoutedEventHandler(OnExecutedSelectAll), new CanExecuteRoutedEventHandler(OnCanExecuteSelectAll)));
Run Code Online (Sandbox Code Playgroud)
我的方法没有被调用.我得出的第三方控制是标记
e.Handled=true;
在它的命令处理程序(我知道这个原因,我已经看到了源,但我不能修改它)
我能做什么?
你有三个选择:
1)您可以注册CommandBinding来处理预览事件,而不是常规事件或者除了常规事件之外:
CommandBinding cb = new CommandBinding(ApplicationCommands.SelectAll);
cb.PreviewCanExecute += OnCanExecuteSelectAll;
cb.PreviewExecuted += OnExecutedSelectAll;
Run Code Online (Sandbox Code Playgroud)
但要注意 - 如果您注册了PreviewExecuted,则通过CommandBinding注册处理程序时,即使您明确将e.Handled设置为false,Executed处理程序也永远不会运行.它确实按预期的方式用于PreviewCanExecute/CanExecute事件对.这是CommandBinding类的实现方式.
因此,仅当您不希望运行基类命令处理程序时才使用PreviewExecuted.
2)或者您可以直接通过CommandManager注册命令处理程序:
CommandManager.AddPreviewCanExecuteHandler(this, OnCanExecuteSelectAll);
CommandManager.AddPreviewExecutedHandler(this, OnExecutedSelectAll);
Run Code Online (Sandbox Code Playgroud)
这不是类处理程序,因此您需要为每个实例执行此操作.然后在你的处理程序中你需要检查天气这是你感兴趣的命令(在事件args中有一个对命令的引用).注意:您仍然需要注册CommandBinding,但如果您只想在CommandManager上直接添加处理程序 - 您不需要使用该命令绑定注册任何处理程序.
3)或者你可以做一些黑客攻击(不是真正的黑客攻击):
this.AddHandler(CommandManager.CanExecuteEvent, new CanExecuteRoutedEventHandler(OnCanExecuteSelectAll), true);
this.AddHandler(CommandManager.ExecutedEvent, new ExecutedRoutedEventHandler(OnExecutedSelectAll), true);
Run Code Online (Sandbox Code Playgroud)
这样就可以注册命令事件处理程序,这样即使它们已被处理也会执行它们.
与上面的点一样,您需要注册命令绑定才能触发CommandManager事件.
这几乎与上面第2点中的内容相同,但是当您调用CommandManager.Add [四个事件之一] Handler时 - 命令管理器使用两个参数版本在控件上调用AddHandler.
| 归档时间: |
|
| 查看次数: |
2314 次 |
| 最近记录: |