【问题标题】:How can I programmatically navigate (not select, but navigate) a WPF TreeView?如何以编程方式导航(不是选择,而是导航)WPF TreeView?
【发布时间】:2012-05-10 02:38:00
【问题描述】:

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

具体来说,我们的用例是TreeViewHierarchicalDataTemplates 之一,其中有一个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 位于ListBoxDataTemplate 中时,此技术效果很好,但如果它位于TreeViewHierarchicalDataTemplate 中则不起作用。

同样,不要将这与简单地选择项目混淆。我们已经知道如何通过将TreeViewItemIsSelected 属性绑定到我们的ViewModel 或手动遍历可视化树以到达我们想要的TreeViewItem 以编程方式做到这一点。我特意询问关于在TreeView 周围导航,复制“向上”和“向下”键的作用。

例如,如果一个较早的兄弟姐妹的孩子展开并且您按下,它会转到该兄弟姐妹的最后一个孩子(或者如果它被展开,则它的孩子的孩子等等)如果早期的兄弟姐妹的孩子被折叠,那么它直接传递给那个兄弟姐妹。如果它们可见或启用等,还有其他规则。

我们也尝试过直接将焦点明确设置到TreeViewItem 并对其执行MoveFocus,但这也不起作用。甚至尝试通过调度程序调用该逻辑以确保焦点确实发生了变化。同样,什么都没有。

我们还尝试在TreeView 本身和TreeViewItem 上使用KeyboardNavigation.DirectionalNavigation,但仍然没有。

即使我们必须做 SendKeys 类型的事情,那也会很有帮助。

【问题讨论】:

    标签: wpf treeview navigation keyboard-shortcuts


    【解决方案1】:

    WPF UI 自动化框架可能有办法做到这一点。但如果这没有成功,这个项目编写了一些代码来做这件事:

    http://wpfsendkeys.codeplex.com/

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 不确定(还)这是否足以得到答案(取决于其他人的想法),但投票给你作为参考。很酷的发现!谢谢!
      猜你喜欢
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 2023-02-20
      相关资源
      最近更新 更多