在WPF中,如何处理在KeyDown事件中按住键后按下的修饰键?

时间:2013-02-18 05:53:12

标签: wpf keyboard keyboard-events

我有一个WPF窗口,我允许用户通过按箭头键移动。我已经通过挂钩KeyDown事件完成了这个:

<Window ... KeyDown="Window_OnKeyDown">

按一下箭头键将移动窗口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键而不是已按下的箭头键运行的。有谁知道我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果用户在箭头键后按下Shift键,e.Key将更改为shift,因此此代码将不起作用。只有我能想到的解决方案是使用

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

并获得箭头键,您可以使用Keyboard.IsKeyDown(),例如Keyboard.IsKeyDown(Key.Up)