WPF MouseLeftButtonDown事件处理程序中Ctrl键按下条件

44

我如何为特定的键盘按键添加额外条件,以应用于 WPF 的 MouseLeftButtonDown 事件处理程序?

例如,Ctrl + 某个按键。

private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{         
    ...
}
4个回答

70
private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
    if(Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl)) {
        MessageBox.Show("Control key is down");
    } else {
        MessageBox.Show("Control key is up");
    }
}

42

如果你只想检测修改键,也可以使用:

if (Keyboard.Modifiers == ModifierKeys.Control) {}
if (Keyboard.Modifiers == ModifierKeys.Shift) {}

等等。更多内容在这里


这个解决方案更简单。 - Tyler Liu
9
请注意,ModifierKeys 是一个标志枚举。因此,正确检查 ctrl 键是否被按下的方式是 if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control) {} - mt_serg
1
@mt_serg,你可以通过调用 if (Keyboard.Modifiers.HasFlag(ModifierKeys.Control)) { } 来使它变得更简单。 - BrainSlugs83

14

在.NET 4.0中,您可以使用:

Keyboard.Modifiers.HasFlag(ModifierKeys.Control)

不过请注意,你不想在热路径上使用 HasFlag()。在 .NET Framework 上,它会在每次运行时产生垃圾。参见这个答案 - l33t
如果按下Ctrl+Shift(或Ctrl+Alt),则此代码返回true。这可能是预期的结果,也可能不是。如果意图是处理确切的Ctrl+<key>组合,则应使用等号运算符。 - Mustafa Özçetin

0

正如Grzegorz Godlewski所说above, 可以使用Keyboard.Modifiers.HasFlag(ModifierKey.Control)

尽管@l33t指出它的性能不是很好,在评论中出现了在.NET 4.5/4.6中改进HasFlag性能的情况(请参见What is it that makes Enum.HasFlag so slow?和下面的评论,还有in this answer的结果)。

但是根据here的结论,仍然没有像进行本地检查(即flagsToCheck & flag != 0)那样快的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接