2013-04-03 23 views
16

Tôi đang làm việc trên một trò chơi, một ứng dụng Windows Store dựa trên WPF và được viết bằng C#. Khi người chơi nhấn phím Esc, tôi muốn tạm dừng trò chơi và hiển thị menu (Tiếp tục, Thoát, v.v.).Sự kiện bàn phím trang toàn cầu trong Windows Store Apps

Âm thanh đơn giản. Đáng buồn thay, nó không phải.

Trò chơi diễn ra trong một Windows.UI.Xaml.Controls.Page và chủ yếu bao gồm hàng trăm Shape s trong một Canvas, nhưng không có đơn Button, TextBox hoặc bất cứ điều gì khác mà hỗ trợ tương tác bàn phím. Tương tác duy nhất là nhấp hoặc nhấn vào hình dạng.

Tôi cần nắm bắt các sự kiện bàn phím, toàn cầu cho toàn bộ trang, bất kể phần tử nào có tiêu điểm hoặc nếu có bất kỳ tiêu điểm nào cả. Bất cứ khi nào phím Esc được nhấn, sự kiện phải kích hoạt.

gì tôi đã cố gắng:

  • Sử dụng sự kiện Page.KeyDown hoặc trọng Page.OnKeyDown(KeyRoutedEventArgs e) (hoặc KeyUp): Không cháy, trừ khi có một yếu tố chẳng hạn như một TextBox với bàn phím lấy nét. Nhưng trong giao diện người dùng của tôi không có yếu tố như vậy.

  • Sử dụng ẩn (Opacity = 0 và/hoặc ẩn dưới Canvas) Hộp văn bản như một bản hack để làm cho KeyDown hoạt động: Ngay khi Canvas hoặc bất kỳ hình dạng nào được nhấp/nhấn, TextBox sẽ mất tiêu điểm và hack ngừng hoạt động. Vì vậy, cần có nhiều hacks hơn để làm cho nó tập trung, với những thứ khác như các nút menu. Hơn nữa, các TextBox đôi khi cho thấy bàn phím phần mềm Windows, mà là khá không mong muốn. Một hack không hoạt động, dễ vỡ.

  • Sử dụng InputGestures, KeyBinding v.v.: Không có sẵn cho Ứng dụng Windows Store.

Bất kỳ ý tưởng hoặc giải pháp nào?

Trả lời

21

Thử sử dụng CoreWindow.KeyDown. Chỉ định trình xử lý trong trang của bạn và tôi tin rằng nó sẽ chặn tất cả các sự kiện keydown.

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

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

Dường như làm việc, cảm ơn. Tôi sẽ làm một số thử nghiệm vào ngày mai và sau đó chấp nhận câu trả lời của bạn. –

+0

@SebastianNegraszus - Không sao, hy vọng nó hoạt động! – keyboardP

2

CoreWindow.GetForCurrentThread(). KeyDown sẽ không nắm bắt được các sự kiện nếu nó tập trung vào một số hộp lưới/WebView/văn bản khác, vì vậy thay vì sử dụng AcceleratorKeyActivated sự kiện. Không phân biệt nơi tập trung là nó sẽ luôn luôn nắm bắt sự kiện.

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; 
      } 
     } 
    } 
} 
Các vấn đề liên quan