1

我正在开发一个应用程序,它使用在运行时交换的大量面板。通过处理 keydown 事件并检查应用程序的当前“状态”以确定如何路由键来控制面板的交换。

我在表单设计器中做一些清理工作,移动面板和标签,现在我以某种方式禁用了我的主表单在我的 keydown 事件中拾取 tab 键的能力。我仍然得到所有其他键,包括输入键。

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

我在主窗体中打开了 keypreview。由于我收到其他关键事件,我不相信我的 keydown 处理程序工作不正确。不知何故,我的表单刚刚停止输入制表键。TabIndexes 是按顺序编号的,但它们并不重要,因为我使用 keypreview 来处理事件,然后让 tabindex 确定它的下一个跳转。

我认为这对于曾经去过那里并与之抗争过的人来说可能是一件容易的事。我有 Tab 键仍在运行的备份,但我今天在逻辑上取得了飞跃,所以我还没有准备好回滚或对表单上的每个对象进行并排比较。

4

2 回答 2

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
于 2012-10-11T18:40:29.590 回答
0

我搜索了 tabstop 并寻找一个对象,这个对象是真的。

我在 VS 中的“查找”没有找到任何内容,但随后我在添加到项目的最后一个面板上看到了一个列表框,该面板打开了 tabstop。

关闭它让我回到了我最初的位置,我的代码拿起了 Tab 键。

于 2012-10-11T18:53:21.960 回答