【发布时间】:2012-05-10 02:38:00
【问题描述】:
我们正在尝试以编程方式模拟“向上”和“向下”箭头键在代码隐藏中围绕 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 中时,此技术效果很好,但如果它位于TreeView 的HierarchicalDataTemplate 中则不起作用。
同样,不要将这与简单地选择项目混淆。我们已经知道如何通过将TreeViewItem 的IsSelected 属性绑定到我们的ViewModel 或手动遍历可视化树以到达我们想要的TreeViewItem 以编程方式做到这一点。我特意询问关于在TreeView 周围导航,复制“向上”和“向下”键的作用。
例如,如果一个较早的兄弟姐妹的孩子展开并且您按下,它会转到该兄弟姐妹的最后一个孩子(或者如果它被展开,则它的孩子的孩子等等)如果早期的兄弟姐妹的孩子被折叠,那么它直接传递给那个兄弟姐妹。如果它们可见或启用等,还有其他规则。
我们也尝试过直接将焦点明确设置到TreeViewItem 并对其执行MoveFocus,但这也不起作用。甚至尝试通过调度程序调用该逻辑以确保焦点确实发生了变化。同样,什么都没有。
我们还尝试在TreeView 本身和TreeViewItem 上使用KeyboardNavigation.DirectionalNavigation,但仍然没有。
即使我们必须做 SendKeys 类型的事情,那也会很有帮助。
【问题讨论】:
标签: wpf treeview navigation keyboard-shortcuts