2016-04-02 54 views
1

我試圖做一些事情發生時,按下鍵,但我的鍵盤似乎沒有註冊。 我試圖使任何關鍵不是特定的事情發生。鍵盤輸入不能註冊

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows; 
using System.Windows.Input; 

namespace KeyDown 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     public static IEnumerable<Key> KeysDown() 
     { 
      foreach (Key key in Enum.GetValues(typeof(Key))) 
      { 
       if (Keyboard.IsKeyDown(key)) 
        yield return key; 
      } 
     } 

     private void MainGrid_KeyDown(object sender, KeyEventArgs e) 
     { 
      if(KeysDown().Any()) 
      { 
       MessageBox.Show("Key pressed"); 
      } 
     } 
    } 
} 

什麼都沒有發生,MainGrid是可以聚焦的。

試過這個解決方案: How to detect if any key is pressed 但仍然沒有任何反應。

+1

您剛剛定義了一個事件處理程序。我沒有看到你實際登記的事件。 – Tal87

+0

是不是'if(Keyboard.IsKeyDown(Key.Return))'註冊任何鍵的方式? – Simon

+0

這是WPF!不是asp.net! – marko

回答

1

還有一些關於此主題的討論here。有一些問題與焦點,試試這個:

XAML

<Grid x:Name="myGrid" Width="Auto" Height="Auto" KeyDown="MainGrid_KeyDown" Focusable="True" /> 

代碼隱藏

namespace KeyDown 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      myGrid.Focus(); // focus programmatically, better put it in OnLoaded event 
     } 

     private void MainGrid_KeyDown(object sender, KeyEventArgs e) 
     { 
      MessageBox.Show("Key pressed"); 
     } 
    } 
} 

我的看法是,也許Grid是空心的,不適用於有重點,插入其他控制哪些是更好的可聚焦的,並添加KeyDown事件給他們。另外檢查KeyDownPreviewKeyDown之間是否有一些差異。

+0

作品,謝謝! – Simon

0

您需要在mainwindow的構造函數中創建一個事件處理函數。 事情是這樣的:

MainGrid.KeyDown += new RouteEventHandler(MainGrid_KeyDown); 

https://msdn.microsoft.com/en-us/library/ms743596%28v=vs.100%29.aspx

在事件處理程序刪除if(KeysDown()任何())。看看你從對象發件人和KeyEventArgs e得到了什麼。

+0

無法找到類型或名稱空間名稱'RouteEventHandler'(您是否缺少使用指令或程序集引用?) 正在使用System.Windows。 – Simon

+0

也不是使用設計器中的事件列表是一樣的嗎?因爲我通過那裏做了事件處理程序? – Simon

+0

我想我記得錯了 - RouteEventHandler - 它可能只是一個事件處理程序。是的,你也可以在設計器中聲明事件。 – marko