我的VB.NET应用程序中的键盘控制和TabStops似乎有问题。
我已经在这里和网络上搜索过了,发现了一些相关的主题(不是1000%相同的问题),我在网络上找到的一些解决方案对我的情况没有帮助。
我不确定我的问题是否主要与分组框的使用有关,是否可以解决。作为控件设置的粗略描述,请参阅此处的示意图概述:
GroupBox1____ GroupBox2_ GroupBox3
Control1_Control4_ Control7
Control2_Control5_ Control8
Control3_Control6_ Control9
我已经按顺序设置了分组框和控件的TabIndex,以便Tab可以在Control1和control9之间循环。当窗体加载时,我通过代码将焦点放在其中一个控件上,以便将初始焦点放在一个控件上。这是没有任何问题的。同样,使用Shift-Tab向后循环效果也很好。
现在的问题是,当用户意外地经过最后一个控件时,例如,Control9有焦点,他按TAB或Control1有焦点,他按Shift-TAB,控件失去焦点,但它不会跳到使用TabStop=True的下一个最低或最高的TabIndex控件。
基本上,它进入没有控件具有焦点的状态,并且按TAB或Shift-TAB不执行任何操作。(我希望它以循环的方式循环)
唯一的方法是用鼠标点击任何控件来重新获得焦点和键盘控制。不确定这是一个bug还是一个特性。
我知道VB.NET将每个分组框作为一组单独的控件来处理,但不确定这是否与我的问题有关。
此外,表单上还有一些其他控件,它们的TabIndex编号较高,但TabStop设置为False (大多数控件无论如何都不是输入控件,例如一些图片框或标签)。这通常不会影响我的理解。
它们是什么类型的控件与此相关吗?(例如,Control9是一个复选框,而COntrol1是一个单选按钮控件)
我已经尝试了一种变通方法,例如捕捉一个按键事件或失去焦点事件,通过代码强制将焦点重新放在顺序中的下一个控件上,但由于某些原因,我无法通过编程来实现,因为在使用TAB或Shift-Tab时,一些尝试过的事件似乎不会触发。
有没有人熟悉这个问题,并对如何从Control9移动到Control1有建议?(或者在按Shift-TAB时从Control1切换到Control9 )?
发布于 2021-11-11 18:10:32
该问题是由一个SplitContainer控件引起的,该控件包含带有第一个面板中的控件的分组框,以及在表单加载事件期间添加到第二个面板中的CEFSharp浏览器插件。
最初对我来说并不是那么明显,因为浏览器不会显示在VS设计器中,并且只在运行时加载。
浏览器插件在获得焦点后劫持了TabStops。
解决方案是在启动浏览器插件并将其添加到第二个面板后,通过Form Load事件中的代码将CEFSharp浏览器插件的TabStop属性更改为False。
https://stackoverflow.com/questions/69925223
复制相似问题