2010-03-10 97 views
5

我已经(不工作)的follwing代码:WPF键盘快捷键 - 为什么这不起作用?

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)) 

从来没有评估为真。 我使用Ctrl而不是Alt以这种方式工作。我的活动还包括CtrlAlt也适用。

+0

事件本身没有开火,或者是有条件的而不是真实的? – 2010-03-10 01:05:55

+0

反对!将解决我的问题。谢谢! – Justin 2010-03-10 01:08:25

+0

这不是一个WPF应用程序吗?如果是的话,这是什么事件/来源,WPF 3.5 KeyEventArgs没有修饰符属性? – 2010-03-10 01:23:40

回答

3

在WPF中使用密钥的更好方法是Key Gestures

eg 注意,这是一个例子,而不是解决方案

<Window.InputBindings> 
    <KeyBinding Command="ApplicationCommands.Open" Gesture="ALT+P" /> 
</Window.InputBindings> 

还有更多的它,那可是你的工作很容易不够。这是WPF处理密钥的方式!

PK :-)

+0

我已经读了一些关于KeyBinding的内容,但为什么他们比使用keyevents更好? – Justin 2010-03-10 01:33:32

+1

整个解决方案是与ApplicationCommands等结合使用。它只是一个整洁的模式。你也可以抽象命令等。有一点点,但我不认为你会真正得到原来的工作方式,因为事件如何发生。 – 2010-03-10 01:38:45

+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 - 它可能有助于“为什么?” :-) – 2010-03-10 01:43:22

2

你需要做一个与ModifierKeys“按位和”,如下图所示...

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

此外,不要忘记设置e参数的Handled财产...

+0

我不小心在我的示例代码中使用了e.Modifiers,而不是Keyboard.Modifiers,这正是我在我的应用程序中实际使用的。我道歉。我无法使用Keyboard.Modifiers获得您的示例。 – Justin 2010-03-10 01:30:02

+0

我实际上无法让它工作? – 2010-03-10 01:32:29

0

MSDN给了我们这个例子:

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

这是否对你的工作?

+0

正如Paul Kohler所说:“WPF 3.5 KeyEventArgs没有Modifiers属性”我错误地在我的示例代码中使用了e.Modifiers。我对这种混乱表示抱歉。 – Justin 2010-03-10 01:46:40

+0

我认为我们中的一些人被抛弃了!我原以为这是一个WinForms问题:) – 2010-03-10 02:52:31

+0

同上:-) *给自己的备忘:读取标签* – 2010-03-10 03:06:20