键盘事件无法正常工作

时间:2012-11-27 10:58:27

标签: c# windows-8 winrt-xaml

我已经创建了一款可以正常使用的游戏,但我对键命令部分有疑问。当我点击屏幕上的某个地方时,我的KeyDown事件不起作用。我猜测具有KeyDown事件处理程序的控件失去了焦点,我的应用程序没有收到消息。我花了一周时间试图解决问题。

我尝试为更多控件设置KeyDown事件。我还尝试设置控件的焦点,处理事件但没有成功。

如果有人告诉我在我的游戏中处理按键集合的正确方法是什么,我将不胜感激,这将适用于我的应用程序中发生的任何事情。我只是想知道用户何时按下箭头键才能更改内容。

4 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,但我接着在LayoutAwarePage.CoreDispatcher_AcceleratorKeyActivated中如何处理它,它似乎都按预期工作。

答案 1 :(得分:0)

我不确定WinRT但是在WPF中,你可以通过添加这样的处理程序来捕获来自所有子控件的路由事件。

this.AddHandler(UIElement.PreviewKeyDownEvent, new RoutedEventHandler(OnKeyDown), true);

这是父控制。它也适用于WinRT,请尝试

修改

如果WinRT中不存在UIElement.PreviewKeyDownEvent,则

UIElement.KeyDownEvent替换为UIElement.PreviewKeyDownEvent

答案 2 :(得分:0)

我之前没有回答,因为系统不允许我这样做,因为我没有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)
{
}

答案 3 :(得分:0)

我刚刚找到了一个非常直接的解决方案。它总是有效,无论元素是否有焦点。

第一名:功能

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;