2013-04-03 15 views
16

Sto lavorando a un gioco, un'app di Windows Store basata su WPF e scritta in C#. Quando il giocatore preme il tasto Esc, voglio mettere in pausa il gioco e mostrare un menu (Continua, Esci ecc.).Eventi tastiera globali della pagina nelle app di Windows Store

Suoni semplici. Purtroppo, non lo è.

Il gioco si svolge in un Windows.UI.Xaml.Controls.Page ed è costituito principalmente da centinaia di Shape s in un Canvas, ma nessuna singola Button, TextBox o qualsiasi altra cosa che supporta l'interazione della tastiera. L'unica interazione è fare clic o toccare forme.

Ho bisogno di catturare gli eventi della tastiera, a livello globale per l'intera pagina, indipendentemente dall'elemento che ha lo stato attivo o se c'è persino una messa a fuoco ecc. Ogni volta che viene premuto il tasto Esc, un evento deve essere attivato.

Quello che ho cercato:

  • Utilizzando l'evento Page.KeyDown o preponderante Page.OnKeyDown(KeyRoutedEventArgs e) (o KeyUp): Non sparare, a meno che non ci sia un elemento, ad esempio un TextBox con il fuoco della tastiera. Ma nella mia interfaccia utente non esiste un elemento del genere.

  • Utilizzando un invisibile (Opacity = 0 e/o nascosto sotto il Canvas) TextBox come un trucco per rendere il lavoro KeyDown: Non appena la tela di canapa o di qualunque forma è cliccato/sfruttato, il controllo TextBox perde il fuoco e l'hack smette di funzionare. Quindi, sono necessari più hack per mantenere la messa a fuoco, che avvita con altre cose come i pulsanti del menu. Inoltre, il TextBox mostra occasionalmente la tastiera del software Windows, che è piuttosto indesiderata. Un hack a malapena funzionante e fragile.

  • Utilizzo di InputGestures, KeyBinding, ecc .: non disponibile per le app di Windows Store.

Qualche idea o soluzione?

risposta

21

Provare a utilizzare CoreWindow.KeyDown. Assegna il gestore nella tua pagina e credo che dovrebbe intercettare tutti gli eventi keydown.

public MyPage() 
{ 
    CoreWindow.GetForCurrentThread().KeyDown += MyPage_KeyDown; 
} 

void MyPage_KeyDown(CoreWindow sender, KeyEventArgs args) 
{ 
    Debug.WriteLine(args.VirtualKey.ToString()); 
} 
+0

Sembra funzionare, grazie. Domani farò altri test e poi accetterò la tua risposta. –

+0

@SebastianNegraszus - Nessun problema, spero funzioni! – keyboardP

2

CoreWindow.GetForCurrentThread(). KeyDown non cattura gli eventi, se l'obiettivo è quello di qualche altra casella della griglia/WebView/testo, così invece utilizzare AcceleratorKeyActivated evento. Indipendentemente da dove è focalizzato, catturerà sempre l'evento.

public MyPage() 
{ 
    Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += AcceleratorKeyActivated; 
} 


private void AcceleratorKeyActivated(CoreDispatcher sender, AcceleratorKeyEventArgs args) 
{ 
    if (args.EventType.ToString().Contains("Down")) 
    { 
     var ctrl = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control); 
     if (ctrl.HasFlag(CoreVirtualKeyStates.Down)) 
     { 
      switch (args.VirtualKey) 
      { 
       case VirtualKey.A: 
        Debug.WriteLine(args.VirtualKey); 
        Play_click(sender, new RoutedEventArgs()); 
        break; 
      } 
     } 
    } 
} 
Problemi correlati