如何以编程方式导航(不选择,但导航)WPF TreeView?

时间:2012-05-10 02:38:00

标签: wpf treeview navigation keyboard-shortcuts

我们正在尝试以编程方式模仿“向上”和“向下”箭头键从代码隐藏中导航TreeView的方式。 (注意:不仅仅是选择项目,而是模仿箭头键导航。)

具体来说,我们的用例是TreeView HierarchicalDataTemplates TextBox中有一个TextBox,其中当然会在关注时窃取所有键盘活动。但由于这是一个单行TreeView,我们基本上要忽略“向上”和“向下”键,而是将它们传递给要在那里处理的基础TextBox

为此,我们将OnPreviewKeyDown子类化,并拦截protected override void OnPreviewKeyDown(System.Windows.Input.KeyEventArgs e) { switch(e.Key) { case Key.Up: case Key.Down: // Swallow the key e.Handled = true; // Get the navigation direction var direction = (e.Key == Key.Up) ? FocusNavigationDirection.Up : FocusNavigationDirection.Down; // Perform the navigation MoveFocus(new TraversalRequest(direction)); break; default: base.OnPreviewKeyDown(e); break; } } 覆盖中的“向上”和“向下”键,如下所示......

TextBox

ListBox位于DataTemplate的{​​{1}}时,此技术效果很好,但如果它位于TreeView的{​​{1}}中则不起作用

同样,不要将此与简单选择项目混淆。我们已经知道如何通过将HierarchicalDataTemplate的{​​{1}}属性绑定到我们的ViewModel或手动遍历可视树来到达我们想要的TreeViewItem来以编程方式执行此操作。我特别询问IsSelected周围的导航,重复“向上”和“向下”按键的操作。

例如,如果一个早期的兄弟姐妹的孩子已经扩大并且你按下了它,那么就会转到该兄弟姐妹的最后一个孩子(或者如果它的孩子的孩子的孩子的孩子被折叠,那么这个孩子的孩子就会崩溃)它直接转向那个兄弟姐妹。如果可见或启用了其他规则,等等。

我们还尝试将焦点明确地设置为TreeViewItem并在其上执行TreeView,但这也无效。甚至尝试通过调度员调用该逻辑以确保焦点实际上已经改变。什么都没有。

我们还尝试使用TreeViewItemMoveFocus本身以及KeyboardNavigation.DirectionalNavigation,但仍然没有。

即使我们必须做TreeView类型的事情,这也会有所帮助。

2 个答案:

答案 0 :(得分:1)

其中一种可能的方法是使用Avalon Control Library TreeListBox 实现,或类似于此(例如您自己的实现)。正如您所提到的,您可以将您的技术应用于 ListBox ,因此我认为您可以轻松将其应用于 TreeListBox ,它直接来自 ListBox

答案 1 :(得分:1)

WPF UI Automation框架可能有办法实现。但如果不能解决这个问题,那么这个项目就可以编写一些代码:

http://wpfsendkeys.codeplex.com/