silverlight按键关闭事件不存在';不要为箭头键开火

silverlight按键关闭事件不存在';不要为箭头键开火,silverlight,key,keydown,Silverlight,Key,Keydown,我在滚动视图中有一块画布。我在scrollview上附加了一个keydown事件处理程序。对于大多数键,会调用处理程序 但是,对于箭头键,不会调用处理程序。相反,scrollview会以适当的方向滚动 我还向scrollview附加了一个keyup处理程序,并且该keyup确实会为箭头键调用 有什么方法可以让arrow key down事件在这里发生吗?我找到了这个愚蠢的黑客程序来让它工作。将scrollview设置为非tabstop可防止它吃掉关键事件。。但是我在页面上有另一个文本框,它突然之

我在滚动视图中有一块画布。我在scrollview上附加了一个keydown事件处理程序。对于大多数键,会调用处理程序

但是,对于箭头键,不会调用处理程序。相反,scrollview会以适当的方向滚动

我还向scrollview附加了一个keyup处理程序,并且该keyup确实会为箭头键调用


有什么方法可以让arrow key down事件在这里发生吗?

我找到了这个愚蠢的黑客程序来让它工作。将scrollview设置为非tabstop可防止它吃掉关键事件。。但是我在页面上有另一个文本框,它突然之间总是有焦点,因为scrollview不再有了。所以我通过让一个不可见的文本框获得焦点来解决这个问题

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);
编辑:我还必须将文本框从画布上移开,因为尽管不可见,但它的轮廓仍然显示出来


第二次编辑:我使用了一个文本框,因为这是我发现的第一个可以捕获按键事件的东西。但是,用户控件可以。因此,最好使用UserControl,而不是不可见的文本框。如果需要,您可以在UserControl上调用Focus()。

这是一个可能的答案-我还没有机会测试它。不过,我在过去也遇到过类似的问题,当控件在您获取事件之前就已经消费了事件。您可以尝试以下几点:

  • 使用PreviewKeyDown事件,我想这就是它的名称。它可以让您在事件被控件消耗之前到达事件
  • 尝试一下mblandfo的建议,尽管如果你这样做,你可能会想把整个过程都封装在一个用户控件中,以隐藏你正在做的事情
  • 在画布对象中添加一个键处理程序,您可以在那里捕获事件,并通过您自己的事件“冒泡”它
  • 除了1)所有这些都算黑客,真的,但祝你好运,我希望其中一个对你有用

    “使用PreviewKeyDown事件,我想这就是它的名称。它可能会让您在控件使用它之前了解该事件。”


    这很有效。只需设置事件参数“Handled=true”,ScrollViewer(或ListBox)就不会在处理完事件后抓住它。不过,我不需要对列表框使用IsTabStop属性;而且它似乎没有任何作用。

    只需使用KeyUp事件即可。工作起来像个符咒。

    在WPF中工作,但silverlight没有向下预览键