0

ユーザーが矢印キーを押して移動できるWPFウィンドウがあります。KeyDownイベントにフックすることでこれを行いました:

<Window ... KeyDown="Window_OnKeyDown">

矢印キーを1回押すと、ウィンドウが1ピクセル移動します。明らかに、これはかなり遅いので、ユーザーがShiftキーを押したままにして、ウィンドウを一度に5ピクセルずつ速く移動できるようにします。

private void Window_OnKeyDown(object sender, KeyEventArgs e)
{
    var key = e.Key;
    var pixelAmount = e.KeyboardDevice.Modifiers == ModifierKeys.Shift ? 5 : 1;

    switch (key)
    {
        case Key.Up:
            Top = Top - pixelAmount;
            break;
        case Key.Down:
            Top = Top + pixelAmount;
            break;
        case Key.Left:
            Left = Left - pixelAmount;
            break;
        case Key.Right:
            Left = Left + pixelAmount;
            break;
    }
}

このコードは、ユーザーがShift矢印キーを押してから押すとうまく機能します。問題は、ユーザーが最初に矢印キーを押したまま、を押しShiftて移動を高速化した場合、これは機能しないことです。これは、これがWindow_OnKeyDown()アクティブShiftキーであると見なされ、switchステートメントが既に押された矢印キーではなくShiftキーに対して実行されるためです。誰かが私がこの振る舞いを修正する方法を知っていますか?

4

1 に答える 1

0

ユーザーが矢印キーの後に Shift キーを押すと、e.Key がシフトに変わるため、このコードは機能しません。私が考えることができる唯一の解決策は、

 bool Shift = (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))

矢印キーも取得するには、Keyboard.IsKeyDown() を使用できます。たとえば、Keyboard.IsKeyDown(Key.Up)

于 2013-02-18T06:44:11.603 に答える