WPF FocusNavigationDirection,MoveFocus和Arrow键

我有一个简单的应用程序(一个带有6个按钮的网格 – 两行3 – 用于测试),我正在处理左右箭头键,如下所示

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文档对于如何定义“左侧”有点模糊。

如果需要,我还将每个按钮的制表位定义为1到6。

为什么在使用“this”(窗口自己的范围)时需要获取elementWithFocus?

我修改了你的代码,它对我有用:

  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); } 

您是否尝试过FocusNavigationDirection.Previous (左侧)和FocusNavigationDirection.Next (右侧)?

这可能比其他值提供更可预测的行为。