在Silverlight中捕获关键事件

在Silverlight中捕获关键事件,silverlight,input,keyboard,Silverlight,Input,Keyboard,背景:我有一个应用程序,我希望能够捕获键盘事件。在主屏幕上,用户单击开始按钮。在游戏过程中,“开始”按钮消失,并显示一个重置按钮(两个控件上的可见性发生变化)。这是仅有的两个标准控件,因为所有其他控件都是非聚焦用户控件 问题:当用户单击开始(从而使其获得焦点)时,它会隐藏并显示重置,重置按钮似乎会自动获得焦点。这并不可怕,因为按键事件仍然会引发,但焦点会导致一个大问题。如果用户按空格键,则按钮将其解释为单击事件 如果我为按钮本身添加一个KeyUp和KeyDown处理程序,并将事件设置为Handl

背景:我有一个应用程序,我希望能够捕获键盘事件。在主屏幕上,用户单击开始按钮。在游戏过程中,“开始”按钮消失,并显示一个重置按钮(两个控件上的可见性发生变化)。这是仅有的两个标准控件,因为所有其他控件都是非聚焦用户控件

问题:当用户单击开始(从而使其获得焦点)时,它会隐藏并显示重置,重置按钮似乎会自动获得焦点。这并不可怕,因为按键事件仍然会引发,但焦点会导致一个大问题。如果用户按空格键,则按钮将其解释为单击事件

如果我为按钮本身添加一个KeyUp和KeyDown处理程序,并将事件设置为Handled,那么如果我按住空格并放开,它将吞下事件,但如果我只是点击它,则不会


问题:如何防止共享空间激活按钮,同时仍然能够响应我的应用程序中的共享空间?

考虑创建一个简单的自定义控件,或者使用一个可以设置为启用的控件。然后,将它放在同一个网格中的某个位置,并连接到它的关键事件和您想要捕获的其他输入事件

要确保焦点转到“不可见”控件,可以在按下开始按钮后调用
(yourControlsNameHere).focus()


您可以使用视觉/选项卡顺序,在重置按钮之前或之后放置隐藏的焦点捕获控件。我不认为你的用户会介意这样的想法,即在应用程序周围进行选项卡切换可以让他们将焦点放在与其输入相关联的不可聚焦的用户控件上。

你可以将两个按钮的IsTabStop属性设置为false(例如,当按下“开始”按钮时)。这样他们就不可能获得焦点,也永远不会处理键盘事件


谢谢!这就是我所做的。唯一的副作用是,我似乎无法使用空格键,因为Windows使用它来创建单击事件。为了解决这个问题,我只连接了click事件处理程序。为简单起见,我创建了一个标准按钮,其边框大小为零,在选项卡顺序中的重置按钮之后创建了1x1大小的按钮。由于空格键/点击事件的奇怪性,您无法按住空格键来接收多个事件(无论如何都很容易),但在我的应用程序中,这并不太糟糕。非常感谢您的回复!