Keyboard.IsKeyDown始终返回true

时间:2016-06-16 22:00:20

标签: c# wpf user-interface keyboard-events

我有一个包含inputbindings的UI。

<Window.InputBindings>
<KeyBinding 
    Key="Up" 
    Command="{Binding Up}" />

我想使用这个键绑定来向下滚动各种元素。我可以使用像这样的方法在窗口中使用in build key-down repeat。

    public void selectionUp()
    {
        SelectionNo += 1;
    }

这很有效。如果我按向上键,选择将向上移动。但是,根据用户在Windows中对键盘重复进行的任何设置,我不喜欢事件看起来很慢的方式。所以我想做这样的事情:

  • KeyPressedEvent Hit
  • KeyDown bool设置为true
  • KeyDown为true
    • +1选择
    • 更新用户界面
    • 检查键仍然按下
    • 更新KeyDown bool,如果不是

所以我最终得到了这样的方法......

        public void positionUp()
    {
        if (!keyUpIsDown) //needed to prevent this while loop being accessed multiple times
        {
            keyUpIsDown = true;
            while (keyUpIsDown)
                {
                SelectionNo += 1;
                if (Keyboard.IsKeyUp(Key.Up))
                {
                    keyUpIsDown = false;
                }
            }
        }
    }

我遇到的问题是'if(Keyboard.IsKeyUp(Key.Up))'总是说即使我已经释放了密钥,密钥也会关闭。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您需要让它有机会处理来自操作系统的事件。一种方法是使代码异步并添加Task.Delay。

  public async void positionUp()
{
    if (!keyUpIsDown) //needed to prevent this while loop being accessed multiple times
    {
        keyUpIsDown = true;
        while (keyUpIsDown)
            {
            SelectionNo += 1;
            if (Keyboard.IsKeyUp(Key.Up))
            {
                keyUpIsDown = false;
            }
            await Task.Delay(100); //you will need to tune this, but it can't be 0
        }
    }
}