无论情况如何,我都能在100%的时间内重现这个恼人的问题。 创建一个.Net项目,C#或VB.Net。将ToolStrip控件添加到窗体。创建一些包含至少2个菜单项的简单DropDownButton。添加您希望的任何其他控件,列表框(填充它以便它可以正确接收焦点)和ComboBox控件。在ToolStrip上指定快捷键或启用TabStop,以便它可以通过键盘接收焦点。
运行项目(Debug / Release,你想要的)。使用键盘提供ToolStrip Focus(通过选项卡或快捷键)。向下箭头进入子项目。现在选择转义键以折叠Toolstrip子菜单。 Tab键到包含几个Items的ListBox或ComboBox。 一切看起来都棒吗?现在使用箭头键在这些控件中导航...惊喜!你回到了ToolStrip和你认为有焦点的控件没有!
我尝试过多种方法来强制关注ListBox。一个例子是我为OnEnter添加事件处理程序(ListBox.Enter + = ...)并添加一些代码,如:
ListBox.Focus();
ListBox.Select();
没有什么是成功的......似乎一旦菜单扩展到工具条上,你将永远停留在使用键盘的这个控件上...... 这对我来说很重要,因为我与只使用键盘导航的盲人用户合作......这是一个错误吗?我不能在MFC中重现这个......
有什么建议吗?
的更新 的 我能够找到一个不会再现这种奇怪的控件......
System.Windows.Forms.MainMenu是唯一不像其他人一样的“工具栏对象”......
我仍然喜欢上面的一些反馈(帮助他人和我自己)......
更新2 根本问题在[ToolStripObject] .TabFocus属性中...如果设置为false,则所有似乎都可以正常工作......将焦点重新放回到“看起来”像是它的焦点的控件。但是,具有允许盲人用户通过选项卡在所有UI控件中导航的功能是一个很方便的实现...这太糟糕了,这个属性不能像它应该那样工作....
答案 0 :(得分:2)
我通过覆盖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);
}
}