2011-04-19 126 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); 
    }