Silverlight中的KeyDown事件无法响应箭头键

4

我有一个位于scrollview内部的canvas。我将keydown事件处理程序附加到了scrollview上。对于大多数键,处理程序都会被调用。

然而,对于箭头键,处理程序不会被调用。相反,scrollview会朝着相应的方向滚动。

我还将keyup处理程序附加到了scrollview上,对于箭头键,keyup确实会被调用。

在这里有没有任何方法可以获取箭头键按下事件?

4个回答

2

只需使用KeyUp事件即可。非常好用。


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


0
这是一个可能的答案 - 我还没有测试过。我在过去也遇到过类似的麻烦,当控件在你获取事件之前就将其消耗时。你可以尝试几件事情:
  1. 使用PreviewKeyDown事件,我想那是它的名字。它可能让你在控件消耗事件之前获取事件。
  2. 尝试mblandfo的建议,不过如果你这样做,你可能要将整个东西包装在一个用户控件中,以便将你正在做的隐藏起来,不让其他代码知道。
  3. 向Canvas对象添加一个键处理程序,你可能会在那里捕获事件,并通过自己的事件“冒泡”。
除了1)外,所有这些都算作hack,但祝你好运,希望其中一个适用于你!

-1

使用PreviewKeyDown事件,我认为那就是它的名字。这可能会让您在控件消耗事件之前获取该事件。

这很有效。只需设置事件参数"Handled = true",然后ScrollViewer(或ListBox)在您处理完事件后不会再抓住它。虽然我没有使用ListBox的IsTabStop属性,但它似乎也没有起到任何作用。


3
可以在WPF中使用该方法,但是Silverlight没有预览按下键。 - Mike Blandford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接