C# 是否可以禁用TreeView的默认Ctrl箭头滚动行为?
我们有一个树状视图,我们想手动处理CTRL-Arrow组合键。但是,内置行为是滚动列表,而不实际更改所选项目 有没有办法禁用此功能,以便即使在按下控制键时,箭头也会更改所选项目C# 是否可以禁用TreeView的默认Ctrl箭头滚动行为?,c#,wpf,treeview,arrow-keys,ctrl,C#,Wpf,Treeview,Arrow Keys,Ctrl,我们有一个树状视图,我们想手动处理CTRL-Arrow组合键。但是,内置行为是滚动列表,而不实际更改所选项目 有没有办法禁用此功能,以便即使在按下控制键时,箭头也会更改所选项目 注意:是的,我知道PreviewKeyDown函数,但是当我获取事件并处理它时,我不确定如何以编程方式使树中的选择按照用户的预期工作。i、 e.关于扩展或折叠的节点,从一个分支跳到另一个分支等等。树状视图中的键盘选择代码与多个节点一样难看。。。我试图实现正确的多选,但键盘导航代码的可扩展性不强 我最终调用了一个非公共方法
注意:是的,我知道PreviewKeyDown函数,但是当我获取事件并处理它时,我不确定如何以编程方式使树中的选择按照用户的预期工作。i、 e.关于扩展或折叠的节点,从一个分支跳到另一个分支等等。树状视图中的键盘选择代码与多个节点一样难看。。。我试图实现正确的多选,但键盘导航代码的可扩展性不强 我最终调用了一个非公共方法,作为一个不错的切入点:
private delegate DependencyObject PredictFocusedElement(DependencyObject sourceElement, FocusNavigationDirection direction, bool treeViewNavigation, bool considerDescendants);
// get the default KeyboardNavigation instance
KeyboardNavigation keyboardNavigation = (KeyboardNavigation)typeof(FrameworkElement).GetProperty("KeyboardNavigation", BindingFlags.NonPublic | BindingFlags.Static).GetMethod.Invoke(null, null);
// create a delegate for the PredictFocusedElement method
_predictFocusedElement = (PredictFocusedElement)typeof(KeyboardNavigation).GetMethod("PredictFocusedElement", BindingFlags.NonPublic | BindingFlags.Instance, Type.DefaultBinder,
new Type[] { typeof(DependencyObject), typeof(FocusNavigationDirection), typeof(bool), typeof(bool) },
null).CreateDelegate(typeof(PredictFocusedElement), keyboardNavigation);
现在,一旦有了该代理,就可以控制焦点:
tvi = (TreeViewItemEx)_predictFocusedElement(tvi, FocusNavigationDirection.Down, true, true);
tvi.Focus();
如果你想看到难看的代码,你可以看看ILSpy或其他版本中的PredictFocusedElement代码:。是的,我以前见过预测代码,但这是第一个看起来很有希望的示例!我来试一试。谢谢如果它有效,我会将你的答案标记为已接受。@MarqueIV-好吧,它应该会LOL。在内部,TreeView调用相同的精确方法。我在自定义树视图中使用它,它在Win7/VS2015/.NET4.6上运行良好。