如何判断WPF CommandBinding是否由快捷键触发?
如何判断WPF CommandBinding的触发方式(区分键盘快捷键与按钮/菜单项)
我完全懂你的困扰——之前我也踩过sender这个坑,它确实只会返回你绑定命令的那个元素(也就是你的窗口),根本帮不上判断触发源的忙。不过有两个靠谱的方法可以解决这个问题,咱们一步步来:
方法一:通过e.OriginalSource识别触发控件类型
ExecutedRoutedEventArgs里的OriginalSource才是真正发起命令的元素,和sender指向的路由绑定元素完全不同。你可以直接判断它的类型:
private void AddObjectCommand_Executed(object sender, ExecutedRoutedEventArgs e) { bool isKeyboardTriggered = true; // 如果触发源是按钮或者菜单项,说明不是键盘快捷键触发 if (e.OriginalSource is Button || e.OriginalSource is MenuItem) { isKeyboardTriggered = false; } yap.AddObject(isKeyboardTriggered); }
这个方法简单直接,但有个小局限:如果你的命令还可能被其他自定义控件触发,就得把那些控件类型也加进去判断。
方法二:通过命令的InputGesture精准匹配快捷键
如果你想更严谨地判断是否是通过注册的键盘快捷键触发的,直接检查当前输入是否匹配命令的InputGesture就最靠谱了:
private void AddObjectCommand_Executed(object sender, ExecutedRoutedEventArgs e) { bool isKeyboardTriggered = false; var routedCommand = e.Command as RoutedCommand; if (routedCommand != null) { // 遍历命令的所有输入手势,匹配当前输入 foreach (var gesture in routedCommand.InputGestures) { if (gesture is KeyGesture keyGesture && keyGesture.Matches(null, e)) { isKeyboardTriggered = true; break; } } } yap.AddObject(isKeyboardTriggered); }
这个方法不管触发源是什么控件,只要是通过你注册的键盘快捷键触发的命令,都会准确识别出来,适配性更强。要是你是在XAML里给命令绑定了快捷键(比如<KeyBinding Command="local:YourCommands.AddObject" Gesture="Ctrl+N"/>),这个方法会完美匹配对应的快捷键触发场景。
内容的提问来源于stack exchange,提问作者yvan vander sanden




