2010-03-10 35 views
5

Tôi đã mã follwing (mà không hoạt động):Phím tắt WPF - Tại sao tính năng này không hoạt động?

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

Tại sao không làm việc này? Sự kiện này đang kích hoạt, nhưng

(e.Key == Key.P) && (Keyboard.Modifiers == ModifierKeys.Alt)) 

không bao giờ được đánh giá là đúng. Sự kiện tương tự của tôi sử dụng Ctrl thay vì Alt theo cách này hoạt động. Ngoài ra các sự kiện của tôi bao gồm CtrlAlt cũng hoạt động.

+0

Bản thân sự kiện đó không được kích hoạt, hoặc là điều kiện không được mô tả đúng? –

+0

Opps! Sẽ sửa chữa câu hỏi của tôi. Cảm ơn! – Justin

+0

Đây không phải là một ứng dụng WPF? Nếu như vậy sự kiện/nguồn là gì, WPF 3.5 KeyEventArgs không có thuộc tính Modifiers ???? –

Trả lời

3

Cách tốt hơn để làm việc với các khóa trong WPF là Key Gestures

ví dụ: lưu ý rằng đây là một ví dụ, không phải là một giải pháp

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

Có nhiều với nó rằng đó nhưng bạn sẽ làm việc đó một cách dễ dàng đủ. Đó là cách WPF để xử lý các phím!

PK :-)

+0

Tôi đã đọc một chút về KeyBinding, nhưng tại sao nó là tốt hơn so với sử dụng keyevents? – Justin

+1

Các giải pháp toàn bộ là sử dụng kết hợp với ApplicationCommands vv Nó chỉ là một mô hình neater. Ngoài ra bạn có thể tóm tắt lệnh vv Có một chút để nó nhưng tôi không nghĩ rằng bạn sẽ thực sự có được cách ban đầu để làm việc vì cách các sự kiện cháy. –

+1

Xem http://msdn.microsoft.com/en-us/library/ms752308.aspx để biết thông tin chính thức. Ngoài ra, hãy xem http://en.csharp-online.net/WPF_Concepts%E2%80%94Controls_with_Built-In_Command_Bindings - nó có thể giúp với "tại sao?" :-) –

2

Bạn cần phải làm một 'Bitwise và' với ModifierKeys như hình dưới đây ...

 
    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; 
     } 
    } 

Ngoài ra, đừng quên để thiết lập Handled tài sản của các tham số e ...

+0

Tôi vô tình sử dụng e.Modifiers trong mã ví dụ của tôi thay vì Keyboard.Modifiers, đó là những gì tôi đang thực sự sử dụng trong ứng dụng của tôi. Tôi xin lỗi. Tôi đã không thể có được ví dụ của bạn làm việc với Keyboard.Modifiers. – Justin

+0

Tôi thực sự không thể làm việc đó? –

0

MSDN cho chúng ta ví dụ này:

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

làm việc này cho bạn?

+0

Như đã nói bởi Paul Kohler: "WPF 3.5 KeyEventArgs không có thuộc tính Modifiers" Tôi đã sử dụng nhầm các trình soạn thảo e.Modifier trong mã ví dụ của tôi. Tôi xin lỗi vì sự hiểu nhầm. – Justin

+0

Tôi nghĩ rằng một vài người trong chúng ta đã bị ném bởi điều đó!Tôi nghĩ đó là một câu hỏi WinForms lúc đầu :) –

+0

ditto :-) * bản ghi nhớ cho bản thân mình: đọc thẻ * –

Các vấn đề liên quan