4

我在滚动视图中有一个画布。我将 keydown 事件处理程序附加到滚动视图。对于大多数键,处理程序被调用。

但是,对于箭头键,处理程序不会被调用。相反,滚动视图会在适当的方向上滚动。

我还在滚动视图上附加了一个 keyup 处理程序,并且确实为箭头键调用了 keyup。

有什么方法可以在这里获取箭头键向下事件吗?

4

4 回答 4

2

只需使用 KeyUp 事件。奇迹般有效。

于 2012-12-04T16:32:08.880 回答
1

我发现这个愚蠢的黑客让它工作。将滚动视图设置为不是制表符可以防止它吃掉关键事件。但后来我在页面上有另一个文本框突然总是有焦点,因为滚动视图不再存在。所以我通过让一个不可见的文本框获得焦点来解决这个问题。

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()。

于 2008-10-21T20:14:44.017 回答
0

这是一个可能的答案-我没有机会对此进行测试。不过,我过去也遇到过类似的麻烦,当一个控件在你处理它们之前就已经消耗了这些事件。您可以尝试以下几件事:

  1. 使用 PreviewKeyDown 事件,我认为这就是它的名称。它可以让您在事件被控件消耗之前得到它。
  2. 试试 mblandfo 的建议,尽管如果你这样做,你可能会想把整个事情包装在一个用户控件中,以从你的代码的其余部分隐藏你正在做的事情。
  3. 向 Canvas 对象添加一个键处理程序,您可以在那里捕获事件,并通过您自己的事件“冒泡”它。

除了 1) 所有这些都算作 hack,真的,但是祝你好运,我希望其中一个对你有用!

于 2008-10-27T01:05:35.903 回答
-1

“使用 PreviewKeyDown 事件,我想这就是它的名称。它可以让您在事件被控件消耗之前得到它。”

这行得通。只需设置事件参数“Handled = true”,ScrollViewer(或 ListBox)在您处理完事件后就不会抓住它。不过,我不需要为 ListBox 使用 IsTabStop 属性;无论如何,它似乎没有做任何事情。

于 2009-12-31T16:52:52.290 回答