2012-10-11 15 views
1

我正在使用大量在运行时交换的面板的应用程序。通过处理keydown事件并检查应用程序的当前“状态”以确定如何路由密钥来控制面板的交换。在KeyDown中丢失Tab键的能力

我在表单设计师移动面板和标签周围做一些清理工作,现在我不知何故禁用了我的主窗体在我的keydown事件中拾取tab键的能力。我仍然可以获得所有其他密钥,包括回车键。

该代码没有改变,并且经过了非常多的测试,使用Tab键可以正常工作,所以我只能想象我在设计师中玩时不小心关闭了一些重要的属性。

我在我的主窗体中打开了keypreview。由于我得到其他关键事件,我不相信我的keydown处理程序工作不正确。不知何故,我的表单刚停止喂食tab键。 TabIndexes是按顺序编号的,但它们应该不重要,因为我在使用keypreview处理事件之前让tabindex确定其下一次跳转。

我想这可能是一个容易的人谁曾经在那里,并打过这之前。我有备份与Tab键仍然运作,但我今天在逻辑上做了飞跃,所以我还没有准备好回滚或做表单上的每个对象的并行比较。

回答

2

这不应该工作。当你对表单有任何控制权时都不会有任何控制权。 Tab键和光标键用于导航,将焦点从一个控件移动到另一个控件。

KeyPreview属性是一个VB6传统兼容属性,用于实现自定义快捷键。拦截导航键的代码在之前运行,该代码触发表单的KeyDown事件。你反而应该重写给ProcessCmdKey()方法,它运行之前的导航代码,以便可以看到Tab和光标键:

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean 
    If keyData = Keys.Tab Then 
     '' Do something, preferably navigation related since that what the user expects 
     ''... 
     Return True '' That means that the key was consumed 
    End If 
    Return MyBase.ProcessCmdKey(msg, keyData) 
End Function 
+0

这对Hans Passant非常有帮助。你的解释让我意识到,我一直在处理重要的新闻和导航,在我的项目中都是错误的。我可能已经在解决方案标志中解决了一些问题,您的事件将完全消除。谢谢! – TWood

0

我搜索的制表位,并期待与此作为真正的对象。

我在VS中的“find”找不到任何东西,但后来我看到最后一个面板上的列表框,我把它添加到我的项目中,开启了tabstop。

把它关掉让我回到原来的位置,用我的代码拾取tab键。