2011-04-19 127 views
2

我有一個簡單的應用程序(具有6個按鈕的柵格 - 2行的3 - 它用於測試)和正在處理左和右箭頭鍵如下WPF FocusNavigationDirection,MoveFocus和箭頭鍵

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     FocusNavigationDirection focusDirection = new System.Windows.Input.FocusNavigationDirection(); 

     switch (e.Key) 
     { 
      case Key.Left: 
       focusDirection = System.Windows.Input.FocusNavigationDirection.Left; 
       break; 
      case Key.Right: 
       focusDirection = System.Windows.Input.FocusNavigationDirection.Right; 
       break; 
      default: 
       break; 
     } 
     TraversalRequest request = new TraversalRequest(focusDirection); 

     // Gets the element with keyboard focus. 
     UIElement elementWithFocus = Keyboard.FocusedElement as UIElement; 

     // Change keyboard focus. 
     if (elementWithFocus != null) 
     { 
      elementWithFocus.MoveFocus(request); 
     } 

    } 

不幸的是,這並不像我預期的那樣行事,因爲焦點似乎總是朝着與FocusNavigationDirection指定的方向相反的方向移動。

爲什麼會這樣? MSDN Documentation對於如何定義「左側」有點含糊。

在它需要的情況下,我也通過6

回答

1

定義每個按鈕爲1的製表你試過FocusNavigationDirection.Previous(左)和FocusNavigationDirection.Next(右)?

這可能會給出比其他值更可預測的行爲。

2

爲什麼你需要獲得elementWithFocus而你可以使用「this」(窗口自己的範圍)?

我修改您的代碼位和它的工作對我來說:

private void Window_OnPreviewKeyDown(object sender, KeyEventArgs e) 
    { 
     switch (e.Key) 
     { 
      case Key.Left: 
       this.MoveFocus(FocusNavigationDirection.Previous); 
       break; 
      case Key.Right: 
       this.MoveFocus(FocusNavigationDirection.Next); 
       break; 
      default: 
       break; 
     } 
    } 

    private void MoveFocus(FocusNavigationDirection direction) 
    { 
     var request = new TraversalRequest(direction); 
     this.MoveFocus(request); 
    }