2013-04-03 16 views
16

Bir oyun üzerinde çalışıyorum, WPF'ye dayanan ve C# ile yazılmış bir Windows Mağaza Uygulaması. Oyuncu Esc tuşuna bastığında, oyunu duraklatmak ve bir menü göstermek istiyorum (Devam, Çık, vb.).Windows Mağazası'ndaki Page-global klavye olayları Page 0 Küresel klavye uygulamaları

Basit sesler. Ne yazık ki, öyle değil.

oyun Windows.UI.Xaml.Controls.Page gerçekleşir ve öncelikle bir Canvas içinde Shape s yüzlerce oluşur, ancak hiçbir tek Button, TextBox veya klavye etkileşimi destekleyen başka bir şey. Tek etkileşim, şekillere tıklamak veya dokunmaktır.

Genel olarak tüm sayfa için klavye olaylarını yakalamam gerekir; hangi öğeye odaklanılırsa odaklansın veya herhangi bir odaklama bile olsaydı vs. Esc tuşuna her basıldığında bir olay tetiklenir.

Denedim Ne:

  • olayı Page.KeyDown veya geçersiz kılma Page.OnKeyDown(KeyRoutedEventArgs e) (veya KeyUp) kullanarak: Böyle Klavye odaklı bir TextBox gibi bir eleman olmadığı takdirde, yangın yapmaz. Fakat benim arayüzümde böyle bir unsur yok. görünmez bir kullanma

  • (Opacity = 0 ve/veya Tuval altında gizli) bir hack KeyDown çalışması için TextBox: En kısa sürede Tuval veya herhangi Şekli vurdu/tıklandığında olarak, TextBox odağı kaybettiğinde ve kesmek çalışmayı durdurur. Böylece, odağı tutması için daha çok korsanlık gerekiyor, bu da menü düğmeleri gibi diğer şeylerle vidalanıyor. Dahası, TextBox zaman zaman oldukça istenmeyen Windows yazılım klavyesini gösterir. Zorlukla çalışan, kırılgan bir hack.

  • InputGestures, KeyBinding vb. Kullanma: Windows Store Apps için geçerli değildir.

Herhangi bir fikir veya çözüm var mı?

cevap

21

CoreWindow.KeyDown ürününü kullanmayı deneyin. İşleyiciyi sayfanıza atayın ve tüm önemli olayları durdurması gerektiğine inanıyorum.

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

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

Çalıştığınız için teşekkür ederiz. Yarın biraz daha test yapacağım ve cevabını kabul edeceğim. –

+0

@SebastianNegraszus - Sorun değil, işe yarıyor! – keyboardP

2

CoreWindow.GetForCurrentThread(). KeyDown o odak diğer bazı ızgara/webView/metin kutusunda ise olayları yakalamak, bunun yerine AcceleratorKeyActivated olayı kullanmaz. Odak noktasından bağımsız olarak, olayı her zaman yakalar.

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