【问题标题】:In WPF, how do I handle modifier keys that are pressed after a key is held down in a KeyDown event?在 WPF 中,如何处理在 KeyDown 事件中按住某个键后按下的修饰键?
【发布时间】:2013-02-02 12:41:27
【问题描述】:

我有一个 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 键而不是已经按下的箭头键运行的。有谁知道我该如何解决这个问题?

【问题讨论】:

    标签: wpf keyboard keyboard-events


    【解决方案1】:

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

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

    要获取方向键,也可以使用 Keyboard.IsKeyDown(),例如 Keyboard.IsKeyDown(Key.Up)

    【讨论】:

    • 嘿 Manish,我已经尝试过了,虽然它大部分都按预期工作,但在您按下 shift 键的那一刻会有一点延迟。当您按下 shift 键时,操作系统会将其检测为新按键,然后对其应用按键重复延迟。这会导致窗口立即移动 5 个像素,然后窗口不会移动,直到按键重复延迟过去。如果您连续快速按 shift,这会导致一种奇怪的行为,看起来只有在按住箭头键的同时按 shift 键时,窗口才会移动。
    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2010-10-15
    • 2012-02-15
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多