发生的事情是箭头键正在导航表单上的控件,就像Tab键一样。每次按下箭头键都会将焦点从当前活动控件移动到与该箭头键相同的相对方向的下一个控件。
KeyDown
这种对箭头键的解释是在比您正在处理的表单事件更高的级别上实现的。每个按键实际上都被ProcessDialogKey
function消耗,这会阻止该按键事件被传递给您的KeyHandling
方法以进行任何进一步的处理。
按下键时一切都按预期工作的原因Ctrl是该ProcessDialogKey
函数不使用这些事件,从而允许将它们传递给您的事件处理程序方法。该方法的文档告诉我们:
该方法不对包含 ALT 或 CONTROL 修饰符的击键执行任何处理。
如果您不希望箭头键在控件之间导航而只是“单击”恰当命名的按钮,那么解决方案应该很明显:您需要覆盖该ProcessDialogKey
方法,添加您的自定义键处理逻辑,并返回一个值“True”表示您自己处理了密钥。否则,您将继续调用基类,以免破坏对 和 之类的标准Tab处理Enter。同样,这里的文档非常清晰:
当重写ProcessDialogKey
派生类中的方法时,控件应返回 true 以指示它已处理键。ProcessDialogChar
对于控件未处理的键,应返回调用基类方法的结果。
只需将以下代码添加到您的表单中,然后删除KeyHandling
您现在拥有的方法:
Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
Select Case keyData
Case Keys.Left
btnPrev.PerformClick()
Return True
Case Keys.Right
btnNext.PerformClick()
Return True
Case Keys.Up
btnFirst.PerformClick()
Return True
Case Keys.Down
btnLast.PerformClick()
Return True
End Select
Return MyBase.ProcessDialogKey(keyData)
End Function