.Net Toolstrip / MenuStrip焦点问题

时间:2013-01-09 15:03:02

标签: c# winforms menu focus toolstrip

无论情况如何,我都能在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控件中导航的功能是一个很方便的实现...这太糟糕了,这个属性不能像它应该那样工作....

1 个答案:

答案 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);
  }
}