2016-04-02 14 views
1

Ich versuche, etwas zu bewirken, wenn eine Taste gedrückt wird, aber meine Tastatur scheint nicht zu registrieren. Ich versuche etwas mit irgendwelchen Schlüsseln passieren zu lassen, die nicht spezifisch sind.Tasteneingabe nicht registriert

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

Es passiert nichts, die MainGrid fokussierbar ist.

Erprobt diese Lösung: How to detect if any key is pressed aber immer noch nichts passiert.

+1

Sie haben gerade einen Event-Handler definiert. Ich sehe nicht, wo Sie sich tatsächlich registriert haben. – Tal87

+0

Ist 'if (Keyboard.IsKeyDown (Key.Return))' der Weg, um einen Schlüssel zu registrieren? – Simon

+0

Das ist WPF! Nicht asp.net !. – marko

Antwort

1

Es gibt auch eine Diskussion zu diesem Thema here. Es gibt einige Probleme mit dem Schwerpunkt, versuchen Sie dies:

XAML

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

Code hinter

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

Meine Meinung vielleicht ist Grid hohl ist und nicht dazu gedacht ist Fokus für mit, andere Steuerelemente einzufügen, die sind besser fokussierbar und fügen das KeyDown-Ereignis hinzu. Überprüfen Sie auch, ob ein Unterschied zwischen KeyDown und PreviewKeyDown besteht.

+0

Works, danke! – Simon

0

Sie müssen einen Ereignishandler im Konstruktor des Hauptfensters erstellen. Etwas wie folgt aus:

MainGrid.KeyDown += new RouteEventHandler(MainGrid_KeyDown); 

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

entfernen if (KeysDown() Beliebig().) In der Event-Handler. Und schau, was du vom Objektsender und KeyEventArgs e bekommst.

+0

Der Typ oder Namespace 'RouteEventHandler' konnte nicht gefunden werden (fehlt eine using-Direktive oder eine Assemblyreferenz?) System.Windows wird verwendet. – Simon

+0

Wird die Ereignisliste im Designer auch nicht gleich verwendet? wie ich den Event-Handler durch dort gemacht habe? – Simon

+0

Ich denke, ich erinnere mich falsch - RouteEventHandler - es kann nur ein Eventhandler sein. Ja, Sie können die Ereignisse auch im Designer deklarieren. – marko

Verwandte Themen