我在滚动视图中有一个画布。我将 keydown 事件处理程序附加到滚动视图。对于大多数键,处理程序被调用。
但是,对于箭头键,处理程序不会被调用。相反,滚动视图会在适当的方向上滚动。
我还在滚动视图上附加了一个 keyup 处理程序,并且确实为箭头键调用了 keyup。
有什么方法可以在这里获取箭头键向下事件吗?
我在滚动视图中有一个画布。我将 keydown 事件处理程序附加到滚动视图。对于大多数键,处理程序被调用。
但是,对于箭头键,处理程序不会被调用。相反,滚动视图会在适当的方向上滚动。
我还在滚动视图上附加了一个 keyup 处理程序,并且确实为箭头键调用了 keyup。
有什么方法可以在这里获取箭头键向下事件吗?
只需使用 KeyUp 事件。奇迹般有效。
我发现这个愚蠢的黑客让它工作。将滚动视图设置为不是制表符可以防止它吃掉关键事件。但后来我在页面上有另一个文本框突然总是有焦点,因为滚动视图不再存在。所以我通过让一个不可见的文本框获得焦点来解决这个问题。
scrollView.IsTabStop = false;
invisibleTextBox.Foreground = new SolidColorBrush(Colors.Transparent);
invisibleTextBox.Background = new SolidColorBrush(Colors.Transparent);
Canvas.SetZIndex(invisibleTextBox, -1000);
invisibleTextBox.KeyDown += new KeyEventHandler(HandleKeyDown);
invisibleTextBox.KeyUp += new KeyEventHandler(HandleKeyUp);
编辑:我还不得不将文本框从画布上移开,因为尽管它是不可见的,但它的轮廓仍然出现。
第二次编辑:我使用了一个文本框,因为这是我发现的第一个可以捕获 KeyDown 事件的东西。但是,UserControl 可以。因此,使用 UserControl 而不是不可见的文本框可能是更好的做法。如果需要,您可以在 UserControl 上调用 Focus()。
这是一个可能的答案-我没有机会对此进行测试。不过,我过去也遇到过类似的麻烦,当一个控件在你处理它们之前就已经消耗了这些事件。您可以尝试以下几件事:
除了 1) 所有这些都算作 hack,真的,但是祝你好运,我希望其中一个对你有用!
“使用 PreviewKeyDown 事件,我想这就是它的名称。它可以让您在事件被控件消耗之前得到它。”
这行得通。只需设置事件参数“Handled = true”,ScrollViewer(或 ListBox)在您处理完事件后就不会抓住它。不过,我不需要为 ListBox 使用 IsTabStop 属性;无论如何,它似乎没有做任何事情。