WPF键盘快捷键-为什么无法工作?

5
我有以下代码(目前不起作用):

我有以下代码(目前不起作用):

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) {
    e.Handled = true;
    if ((e.Key == Key.P) && (Keyboard.Modifiers == ModifierKeys.Alt)) {
        MessageBox.Show("Thanks!");
    }            
}

为什么这不起作用?事件被触发了,但是……
(e.Key == Key.P) && (Keyboard.Modifiers == ModifierKeys.Alt))

使用Alt键时,代码中的事件可能永远不会被激活(即永远不会变为true)。但是,如果将Ctrl键用于类似的事件,则可以正常工作。另外,包括CtrlAlt键的事件也可以正常工作。


事件本身没有触发,还是条件不满足呢? - BlueRaja - Danny Pflughoeft
糟糕!我会修正我的问题。谢谢! - Justin
这不是一个WPF应用程序吗?如果是,那么这是什么事件/源?WPF 3.5的KeyEventArgs没有Modifiers属性? - Paul Kohler
是的,谢谢。我刚刚注意到并进行了更正。睡眠不足导致状态不佳。 - Justin
2
尝试在标题中捕捉问题,这样可以更吸引人! - Paul Kohler
3个回答

3
在WPF中更好的处理键盘按键的方式是使用Key Gestures。例如:请注意这只是一个示例,不是解决方案
<Window.InputBindings>
  <KeyBinding Command="ApplicationCommands.Open" Gesture="ALT+P" />
</Window.InputBindings>

除此之外还有更多的内容,但你很容易就能处理好。这就是WPF处理键盘输入的方式!

PK :-)


我已经了解了一些关于KeyBinding的内容,但为什么它们比使用keyevents更好呢? - Justin
1
整个解决方案是与ApplicationCommands等一起使用的。这只是一个更整洁的模式。此外,您可以抽象命令等。有一点点复杂,但我认为您实际上不会使原始方法工作,因为事件触发的方式不同。 - Paul Kohler
1
请查看 http://msdn.microsoft.com/en-us/library/ms752308.aspx 获取官方信息。同时,您也可以参考 http://en.csharp-online.net/WPF_Concepts%E2%80%94Controls_with_Built-In_Command_Bindings - 这可能对理解"为什么"有所帮助 :-) - Paul Kohler
感谢您的帮助!并且忍受我的书面问题。非常感激。 - Justin

2
您需要对 ModifierKeys 进行“按位与”操作,如下所示...
    private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if ((e.Key == Key.P) && ((e.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt))
        {
            MessageBox.Show("谢谢!");
            e.Handled = true;
        }
    }
此外,请不要忘记设置 e 参数的 Handled 属性...

我在示例代码中不小心使用了e.Modifiers,而实际上我在我的应用程序中使用的是Keyboard.Modifiers。对此我深表歉意。但我一直无法使用Keyboard.Modifiers使您的示例代码正常工作。 - Justin

0

MSDN 给了我们这个例子:

if(e.Key == Key.P && e.Modifiers == Keys.Alt)

这个对你有用吗?


正如Paul Kohler所说:“WPF 3.5 KeyEventArgs没有Modifiers属性”,我在示例代码中错误地使用了e.Modifiers。对于造成的困惑,我深表歉意。 - Justin
我想我们中有几个人被这个问题搞糊涂了!一开始我还以为这是一个WinForms的问题 :) - Paul Kohler

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