我工作的一个游戏,一个Windows Store应用基于WPF和C#编写的。 当玩家按下Esc键,我想暂停游戏,并显示一个菜单(继续,退出等)。
听起来很简单。 可悲的是,事实并非如此。
游戏的故事发生在一个Windows.UI.Xaml.Controls.Page
,主要由数百Shape
在A S Canvas
,但没有一个Button
, TextBox
或其他任何支持键盘交互。 唯一的互动是点击或点击形状。
我需要捕捉键盘事件,全球整个页面,无论什么元素具有焦点或甚至有任何聚焦在所有等当Esc键被按下时,事件已触发。
我的尝试:
使用事件Page.KeyDown
或压倒一切的Page.OnKeyDown(KeyRoutedEventArgs e)
或KEYUP):不火,除非有一个元素,如TextBox
具有键盘焦点。 但在我的UI也没有这样的元素。
使用不可见( Opacity = 0
和/或在画布隐藏的)文本框作为一个黑客,使工作的KeyDown:只要帆布或任何形状点击/挖掘,文本框失去焦点和黑客停止工作。 因此,需要更多的黑客,使之保持焦点,这与其他事物的螺钉,如菜单按钮。 Futhermore,文本框偶尔显示了Windows软件键盘,这是相当不想要的。 勉强工作,脆弱的黑客。
使用InputGestures
, KeyBinding
等:不适用于Windows应用商店的应用程序。
任何意见或解决方案?
尝试使用CoreWindow.KeyDown 。 分配在你的页面的处理程序,我相信这应该拦截所有的keydown事件。
public MyPage()
{
CoreWindow.GetForCurrentThread().KeyDown += MyPage_KeyDown;
}
void MyPage_KeyDown(CoreWindow sender, KeyEventArgs args)
{
Debug.WriteLine(args.VirtualKey.ToString());
}
CoreWindow.GetForCurrentThread()的KeyDown不会捕获事件,如果它的重点是一些其他的网格/ web视图/文本框,所以改用AcceleratorKeyActivated事件。 无论是将重点它将始终捕获事件。
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;
}
}
}
}