如何通过箭头键禁用焦点更改

xel*_*lor 7 c# wpf focus wpf-controls arrow-keys

我有几个控件(按钮,groupboxes等)和一个大的WPF窗口Viewport3DBorder.

视口显示3D场景,我希望箭头键移动其相机.问题:箭头键总是将焦点更改为另一个UIElement.

如何通过箭头键禁用焦点更改并让它们改变相机位置?

She*_*dan 7

没有一些代码来实际测试总是难以回答,因为没有它,我们只是在猜测.无论哪种方式,我都无法对您的特定情况发表评论,但总的来说,如果我们想要在事件中停止某些预定义的操作,那么我们通常会处理该事件并将e.Handled属性设置为true.

看到您已经想要处理KeyDown事件以检测箭头键的使用,那么您可以同时将e.Handled属性设置为true.但是,你应该处理的PreviewKeyDown事件,而不是,因为它发生之前KeyDown事件,因此更可能有你想要的效果.尝试这样的事情:

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Left || e.Key == Key.Right)
    {
        // Move your camera here
        e.Handled = true;
    }
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*lan 5

如果我们希望能够在一组控件之间切换,但不能在同一组控件之间切换箭头键,则当它们处于键盘导航模式时,应该可以设置 KeyboardNavigation.DirectionalNavigation="None"为容器(在本例中为窗口)进行设置。

但是,似乎有一些错误使该解决方案无法正常工作。

设置的解决方法KeyboardNavigation.DirectionalNavigation="Once"虽然有效。

  • 到目前为止,我唯一注意到的警告是,按下箭头键后,FocusVisualStyle将为当前选定的元素重新加载。