2013-02-18 67 views
0

我有一个WPF窗口,允许用户通过按箭头键移动。我已通过挂钩KeyDown事件完成此操作:在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加速移动。这是因为Window_OnKeyDown()现在认为Shift是活动键,而switch语句是针对Shift键而不是已经按下的箭头键运行的。有谁知道我可以如何解决这个问题?

回答

0

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

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

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

+0

嘿马尼什,我已经尝试过这种方式,虽然它的工作原理与预期相同,但在您点击shift键时会有一些延迟。当您按下shift键时,操作系统会将其检测为新按键,然后将按键重复延迟应用于该按键。这会导致窗口立即移动5个像素,然后窗口不会移动,直到按键重复延迟已过。如果您连续按下快速移位,这会导致一种奇怪的行为,只要您在按住箭头键的同时按下shift键,窗口就会移动。 – 2013-02-18 08:35:26

+0

你能得到这个工作吗? – Manish 2013-02-20 19:27:07

相关问题