Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以禁用TreeView的默认Ctrl箭头滚动行为?_C#_Wpf_Treeview_Arrow Keys_Ctrl - Fatal编程技术网

C# 是否可以禁用TreeView的默认Ctrl箭头滚动行为?

C# 是否可以禁用TreeView的默认Ctrl箭头滚动行为?,c#,wpf,treeview,arrow-keys,ctrl,C#,Wpf,Treeview,Arrow Keys,Ctrl,我们有一个树状视图,我们想手动处理CTRL-Arrow组合键。但是,内置行为是滚动列表,而不实际更改所选项目 有没有办法禁用此功能,以便即使在按下控制键时,箭头也会更改所选项目 注意:是的,我知道PreviewKeyDown函数,但是当我获取事件并处理它时,我不确定如何以编程方式使树中的选择按照用户的预期工作。i、 e.关于扩展或折叠的节点,从一个分支跳到另一个分支等等。树状视图中的键盘选择代码与多个节点一样难看。。。我试图实现正确的多选,但键盘导航代码的可扩展性不强 我最终调用了一个非公共方法

我们有一个树状视图,我们想手动处理CTRL-Arrow组合键。但是,内置行为是滚动列表,而不实际更改所选项目

有没有办法禁用此功能,以便即使在按下控制键时,箭头也会更改所选项目


注意:是的,我知道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上运行良好。