2013-02-18 101 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

相關問題