WPF:如何处理DataGrid的KeyDown事件?

7

我在WPF中使用datagrid控件时遇到了问题。当我按下回车键时,我想要加载所选项到一组控件中,但似乎datagrid.KeyDown已经被处理并且跳转到下一个项目。

我尝试使用keyup,但是这个事件会在datagrid Keydown被触发且datagrid跳转到下一个项目后才触发。

有没有办法完全处理keydown事件?

3个回答

9

使用PreviewKeyDown事件代替KeyDown事件。


2
你知道的...当然使用PreviewKeyDown可以解决问题,但这就像擦掉整个问题一样...如果我坚持使用datagrid的keydown事件,难道没有处理它的方法吗? - Pouyan
@Pouyan 我认为没有,因为某些控件在特定事件上设置了 e.Handled = true,这意味着事件将不会继续通过事件树。 - Rachel
2
我相信一定有办法。因为如果某些控件最初自己处理它们的事件,开发人员就无法在设计器中看到该事件。我在datagrid中看到KeyDown事件的事实意味着我绝对可以自己处理它。这就像给你访问银行账户的权限,但告诉你只能看到它,交易由其他人处理。 - Pouyan
在我的情况下,网格也会吞噬预览事件,具体来说是PreviewMouseLeftButtonUp。 - MikeKulls

1

可能 KeyDown 由 ClassHandler 处理。
实例监听器在类监听器之后。

MSDN 上有一个很好的解释。


0

您可以将逗号分隔的处理程序列表添加到事件中...

Private Sub dgMyDataGrid_KeyDown(sender As Object, e As KeyEventArgs) Handles dgMyDataGrid.KeyDown, dgSymbols.PreviewKeyDown
    
    ' Perform event programming here...    
    
End Sub

这会触发“预览”事件的处理,同时也会触发按键事件,因此您不必编写多个模块。


只是为了澄清:这不会“同时”触发事件。它会执行子程序两次(如果事件实际上被触发并且没有被其他人标记为“已处理”),每个事件都会执行一次,我认为这通常不是你真正想要的。 - mike
确实,@mike,你说得对。然而,有时它确实会出现我可以回应的事件。例如:我曾经看到一些代码完全绕过简单的测试来显示一个MsgBox,如果用户点击按钮,则代码完全被忽略,屏幕上什么也不会出现。 - user20568

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