我们正在尝试以编程方式模仿“向上”和“向下”箭头键从代码隐藏中导航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
,但这也无效。甚至尝试通过调度员调用该逻辑以确保焦点实际上已经改变。什么都没有。
我们还尝试使用TreeViewItem
,MoveFocus
本身以及KeyboardNavigation.DirectionalNavigation
,但仍然没有。
即使我们必须做TreeView
类型的事情,这也会有所帮助。
答案 0 :(得分:1)
其中一种可能的方法是使用Avalon Control Library的 TreeListBox 实现,或类似于此(例如您自己的实现)。正如您所提到的,您可以将您的技术应用于 ListBox ,因此我认为您可以轻松将其应用于 TreeListBox ,它直接来自 ListBox 强>
答案 1 :(得分:1)
WPF UI Automation框架可能有办法实现。但如果不能解决这个问题,那么这个项目就可以编写一些代码: