2010-03-10 52 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