2016-04-02 2 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. Также проверьте, есть ли разница между KeyDown и PreviewKeyDown.

+0

Работы, спасибо! – Simon

0

Вам необходимо создать обработчик событий в конструкторе главного окна. Что-то вроде этого:

MainGrid.KeyDown += new RouteEventHandler(MainGrid_KeyDown); 

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

удалить, если (KeysDown() Any().) В обработчик событий. И посмотрите, что вы получаете от отправителя объекта и KeyEventArgs e.

+0

Не удалось найти имя типа или пространства имен 'RouteEventHandler' (вам не хватает директивы using или ссылки на сборку?) Используется System.Windows. – Simon

+0

Также не используется список событий в дизайнере так же? как я сделал обработчик событий там? – Simon

+0

Я думаю, что помню неправильно - RouteEventHandler - это может быть просто обработчик событий. Да, вы можете объявить события в дизайнере тоже. – marko

Смежные вопросы