Shift + Tab在TreeView控件中不起作用

我无法使用Shift + Tab在包含TextBox的TreeView中工作,使用Tab正向导航工作正常并从TreeBox中的TextBox跳转到TextBox。 任何时候使用Shift + Tab时,TreeView中的一个TextBox,然后焦点移动到TreeView外部的前一个控件,而不是TreeView中的前一个控件。

此外,它唯一的Shift + Tab导航无法正常工作,Ctrl + Shift + Tab按预期工作并按正确的顺序工作。

对我做错的任何建议?

示例代码:

                          

如果使用ILSpy / Reflector查看TreeView.OnKeyDown处理程序,则可以查看问题的原因。 按下Shift + Tab时,TreeView具有特殊处理function。 相关代码是:

 Key key = e.Key; if (key != Key.Tab) { // ... } else { if (TreeView.IsShiftKeyDown && base.IsKeyboardFocusWithin && this.MoveFocus(new TraversalRequest(FocusNavigationDirection.Previous))) { e.Handled = true; return; } } 

不幸的是,您需要使用自定义TreeView类来解决此问题。 像这样的东西有效:

 public class MyTreeView : TreeView { protected override void OnKeyDown(KeyEventArgs e) { if ((Keyboard.Modifiers & ModifierKeys.Shift) != 0 && e.Key == Key.Tab) return; base.OnKeyDown(e); } } 

您不必使用从TreeViewinheritance的自定义类:

 treeView.PreviewKeyDown += this.HandleTreeView_PreviewKeyDown 

和…一起:

 private void HandleTreeView_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Shift) && e.Key == Key.Tab) { var focusedElement = Keyboard.FocusedElement; if (focusedElement != null) { focusedElement.MoveFocus(FocusNavigationDirection.Previous, 1); } e.Handled = true; } } 

也工作正常。

使用此解决方案,您可以创建自定义行为并将其附加到TreeView。