0

正常に動作するゲームを作成しましたが、キー コマンドの部分に問題があります。画面のどこかをクリックすると、KeyDown イベントが機能しません。KeyDown のイベント ハンドラーを持つコントロールがフォーカスを失い、アプリケーションがメッセージを取得していないと推測しました。私はその問題を解決するために 1 週​​間を費やしました。

より多くのコントロールのために KeyDown イベントを設定しようとしました。また、イベントを処理するコントロールのフォーカスを設定しようとしましたが、成功しませんでした。

私のアプリケーションで何が起こっても機能する、私のゲームでキープレスコレクションを処理する正しい方法を誰かが教えてくれれば幸いです。ユーザーがいつ矢印キーを押して内容を変更したかを知りたいだけです。

4

4 に答える 4

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)
{
}
于 2012-11-27T18:59:59.720 に答える
0

これに対する非常に簡単な解決策を見つけました。要素がフォーカスされているかどうかに関係なく、常に機能します。

1つ目:関数

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

2位:イベント

Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated += onAcceleratorKey;
于 2014-09-02T16:42:37.847 に答える
0

WinRT についてはわかりませんが、WPF では、このようなハンドラーを追加することで、すべての子コントロールからルーティングされたイベントをキャッチできます。

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

これは親コントロールです。WinRTでも使えるので試してみてください

編集

UIElement.PreviewKeyDownEventWinRT に存在しないUIElement.KeyDownEvent場合に置き換えますUIElement.PreviewKeyDownEvent

于 2012-11-27T11:10:25.580 に答える