我创建了一个运行良好的游戏,但我在键盘命令部分遇到了问题。当我单击屏幕上的某个位置时,我的 KeyDown 事件不起作用。我猜想具有 KeyDown 事件处理程序的控件失去了焦点,我的应用程序没有收到消息。我花了一周的时间试图解决这个问题。
我试图为更多控件设置 KeyDown 事件。我还尝试设置处理事件但未成功的控件的焦点。
如果有人告诉我在我的游戏中处理按键集合的正确方法是什么,我将不胜感激,这将在我的应用程序中发生任何事情。我只想知道用户何时按下箭头键以更改内容。
我创建了一个运行良好的游戏,但我在键盘命令部分遇到了问题。当我单击屏幕上的某个位置时,我的 KeyDown 事件不起作用。我猜想具有 KeyDown 事件处理程序的控件失去了焦点,我的应用程序没有收到消息。我花了一周的时间试图解决这个问题。
我试图为更多控件设置 KeyDown 事件。我还尝试设置处理事件但未成功的控件的焦点。
如果有人告诉我在我的游戏中处理按键集合的正确方法是什么,我将不胜感激,这将在我的应用程序中发生任何事情。我只想知道用户何时按下箭头键以更改内容。
我刚刚遇到了类似的问题,但我随后在 LayoutAwarePage.CoreDispatcher_AcceleratorKeyActivated 中了解了他们是如何做到的,并且似乎一切都按预期工作。
我没有早点回答,因为系统不允许我做,因为我没有10个声望点,所以我不得不等待8个小时。
这是我输入的,但似乎它需要在那里声明一些我不知道如何制作的东西。
this.AddHandler(UIElement.KeyUpEvent, new RoutedEventHandler(KeyUp), true);
错误信息是
委托 Windows.UI.Xaml.RoutedEventHandler 表示将处理路由事件的方法。错误:“KeyUp”没有重载与委托“Windows.UI.Xaml.RoutedEventHandler”匹配。
将用作事件处理程序的函数具有以下格式:
private void KeyUp(object sender, KeyRoutedEventArgs e)
{
}
我找到了一种绕过我的问题的方法,我想与你分享它以防万一其他人需要它,但如果其他人知道更好的方法让我知道。
我在页面的可见区域放置了一个按钮,并使用了它的 KeyUp 事件,并编写了代码以确保它始终处于活动状态。您可以在下面找到我的代码。
public frmMain()
{
this.InitializeComponent();
btnKeboardCollector.Loaded += MyBoard_Loaded;
btnKeboardCollector.LostFocus += btnKeboardCollector_LostFocus;
btnKeboardCollector.KeyUp += KeyUpHandler;
}
void MyBoard_Loaded(object sender, RoutedEventArgs e)
{
// I do other initialization here
btnKeboardCollector.Focus(Windows.UI.Xaml.FocusState.Programmatic);
}
void btnKeboardCollector_LostFocus(object sender, RoutedEventArgs e)
{
btnKeboardCollector.Focus(Windows.UI.Xaml.FocusState.Programmatic);
}
private void KeyUpHandler(object sender, KeyRoutedEventArgs e)
{
}
我不确定 WinRT,但在 WPF 中,您可以通过添加这样的处理程序来捕获所有子控件的路由事件。
this.AddHandler(UIElement.PreviewKeyDownEvent, new RoutedEventHandler(OnKeyDown), true);
这是父控件。它也适用于 WinRT,请尝试
编辑
替换UIElement.PreviewKeyDownEvent
为UIElement.KeyDownEvent
如果UIElement.PreviewKeyDownEvent
WinRT 中不存在
我刚刚找到了一个非常直接的解决方案。无论元素是否聚焦,它总是有效。
一:功能
private void onAcceleratorKey(object sender, AcceleratorKeyEventArgs e)
{
CoreVirtualKeyStates ctrl = Window.Current.CoreWindow.GetAsyncKeyState(VirtualKey.Control);
if (ctrl == CoreVirtualKeyStates.Down)
{
switch (e.VirtualKey)
{
case VirtualKey.F:
// CTRL + F pressed.
break;
}
}
}
二:事件
Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += onAcceleratorKey;