2008-10-21 69 views
4

我有一个滚动视图内的画布。我将一个keydown事件处理程序附加到scrollview。对于大多数键,处理程序被调用。silverlight keydown事件不会触发箭头键

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

我还附加了一个keyup处理程序的滚动视图和keyup确实被称为箭头键。

有没有办法在这里得到箭头键按下事件?

回答

1

我发现这个愚蠢的黑客使其工作。将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); 

编辑:我也不得不将文本框从画布上移开,因为尽管看不见,它的轮廓仍然显示出来。

第2编辑:我使用了一个文本框,因为这是我发现的第一件可以捕获KeyDown事件的东西。但是,UserControl可以。所以使用UserControl代替不可见的文本框可能会更好。如果需要,可以在UserControl上调用Focus()。

0

这是一个可能的答案 - 我还没有机会测试这个。尽管过去我也遇到类似的麻烦,但是在控制权消耗事件之前,你可以先看看它们。有几件事你可以尝试:

  1. 使用PreviewKeyDown事件,我认为这就是它的名字。它可以让你在事件被控制器消耗之前得到事件。
  2. 尝试使用mblandfo的建议,但如果你这样做了,你可能会将所有东西都包装在用户控件中,以隐藏你在其他代码中所做的事情。
  3. 为Canvas对象添加一个关键处理程序,您可以在那里捕捉事件,并通过自己的事件“冒泡”。

除了1)所有这些都算作黑客,真的,但祝你好运,我希望他们中的一个适合你! “

-1

”使用PreviewKeyDown事件,我认为这就是它的名称,它可以让你在事件被控件占用之前得到它。“

This Works。只要将事件参数设置为“Handled = true”,ScrollViewer(或ListBox)就不会在处理完事件后抓住事件。虽然我不需要使用ListBox的IsTabStop属性;而且它似乎没有做任何事情。

+3

在WPF中工作,但silverlight没有预览关键字down – 2010-01-05 22:56:19

2

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