如何在 WPF 中处理 Ctrl+Click 事件 XAML

How to handle Crtl+Click event in WPF XAML

我想在 WPF XAML 代码隐藏中处理 crtl+click 事件。我注册了 KeyDown 事件和 MouseDown 事件,但我无法同时注册它们。我缺少的是什么。

    private void Window_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key.Equals(Key.LeftCtrl))
        {
            //do something
        }
    }

    private void Window_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (e.ClickCount == 1)
        {
            //do something
        }
    }

谢谢,

RDV

做这样的事情,用一个标志:

bool _isControlPressed = false;

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key.Equals(Key.LeftCtrl))
    {
        _isControlPressed = true;
    }
}

private void Window_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Key.Equals(Key.LeftCtrl))
    {
        _isControlPressed = false;
    }
}

private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.ClickCount == 1 && _isControlPressed)
    {
        //do something
    }
}

_isControlPressed 标志在 down/key 关键事件中是 set/unset。然后,您可以在其他方法中使用此标志来确定键状态。

不要费心跟踪键 Up/Down 事件——它们不可靠(例如,用户可能会在按下和释放之间切换 windows)。处理点击时只需勾选 Keyboard.Modifiers

如果您 想要处理 Ctrl+Click 而不是 Ctrl+Shift+Click,则检查 Modifiers 是否完全匹配:

if (e.ClickCount == 1 && Keyboard.Modifiers == ModifierKeys.Control) {
}

否则,进行选择性按位匹配:

if (e.ClickCount == 1 && (Keyboard.Modifiers & ModifierKeys.Control) != 0) {
}

Keyboard.Modifiers一般应该是一致的:在你处理鼠标事件后才会反映control键的释放,因为所有的输入事件都被处理了按照先进先出的顺序。

一定要仔细阅读冒泡事件与隧道事件(例如,MouseDownPreviewMouseDown),以及事件如何在标记为 Handled 后停止路由。


作为替代方案,您可以使用简单的 MouseGestureMouseActionLeftClickModifiersControl。这实际上取决于您的 UI 是什么样子,以及您是否希望有机会在任何后代控件之前处理该事件。使用鼠标手势应该在(大部分)与处理冒泡 MouseDown 事件相同的场景中工作。但是如果你需要依赖像 PreviewMouseDown 这样的隧道事件,那么手势就不行了。