You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何判断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

火山引擎 最新活动