不管是什么情况,我都可以100%地重现此烦人的问题。
创建一个.Net项目,C#或VB.Net。将一个ToolStrip控件添加到窗体。创建一些简单的DropDownButton,它们至少包含2个菜单项。添加所需的任何其他控件,一个列表框(填充它以便可以正确接收焦点)和ComboBox控件。分配快捷键或在ToolStrip上启用TabStop,以便它可以通过键盘获得焦点。
运行项目(调试/发布,如果您愿意)。使用键盘为ToolStrip聚焦(通过选项卡或快捷键)。向下箭头进入子项目。现在,选择退出键以折叠Toolstrip子菜单。转到包含一些项目的ListBox或ComboBox。
一切看起来不错吧?现在,使用箭头键在这些控件中导航...惊喜!您对ToolStrip的支持与您原本关注的控件不一样!
我尝试了多种方法来强制将重点放在ListBox上。一个示例是我为OnEnter(ListBox.Enter + = ...)添加事件处理程序,并添加一些代码,例如:
ListBox.Focus();
ListBox.Select();
没有什么成功...似乎一旦在工具栏上展开菜单,您将永远无法使用键盘来控制该控件...
由于我与仅使用键盘导航的盲用户一起工作,这一点对我来说很重要。这是一个错误吗?我无法在MFC中重现此内容...
有什么建议么?
更新资料
我能够找到一个不会重现这种陌生感的控件...
System.Windows.Forms.MainMenu是唯一行为与其他工具不同的“工具栏对象”。
我仍然希望获得上述反馈(对他人和我自己有帮助)...
更新2
潜在的问题在[ToolStripObject] .TabFocus属性中……如果设置为false,一切似乎都可以正常工作……将焦点集中在看起来“像”的控件上。但是具有允许盲用户通过选项卡浏览所有UI控件的功能是实现的一件方便的事...太可惜了,此属性无法正常工作。
最佳答案
我通过重写ToolStripMenuItem使它起作用:
public class ToolStripMenuItemEx : ToolStripMenuItem {
protected override bool ProcessCmdKey(ref Message m, Keys keyData) {
if (keyData == Keys.Escape) {
ToolStripDropDownButton tb = this.OwnerItem as ToolStripDropDownButton;
if (tb != null) {
tb.HideDropDown();
return false;
}
}
return base.ProcessCmdKey(ref m, keyData);
}
}