. net工具条/菜单条焦点问题

本文关键字:焦点 问题 菜单 工具 net | 更新日期: 2023-09-27 17:51:15

无论场景是什么,我都能够100%地重现这个恼人的问题。创建一个。net项目,c#或VB.Net。向窗体添加ToolStrip控件。创建几个简单的DropDownButton(s),至少包含2个菜单项。添加您想要的任何其他控件,一个列表框(填充它以便它可以正确接收焦点)和一个ComboBox控件。指定快捷键或在工具条上启用TabStop,以便它可以通过键盘接收焦点。

运行项目(调试/发布,任何你喜欢的)。使用你的键盘给工具条焦点(通过标签或快捷键)。向下箭头进入子项目。现在选择escape键折叠Toolstrip子菜单。选项卡到包含一些项目的列表框或组合框。一切看起来都很好,对吧?现在使用方向键在这些控件中导航…惊喜!你背靠在工具条上,而你认为有焦点的控件却没有!

我已经尝试了多种方法来强制关注列表框。一个例子是,我将为OnEnter (ListBox.Enter+=…)添加事件处理程序,并添加一些代码,如:

ListBox.Focus();
ListBox.Select(); 

什么都没有成功…似乎一旦菜单在工具条上展开,你就会永远用键盘控制这个控件……这对我来说很重要,因为我的工作对象是只使用键盘导航的盲人用户。这是臭虫吗?我无法在MFC中复制这个…

有什么建议吗?

更新 我能够找到一个不复制这种奇怪的控制…

System.Windows.Forms。主菜单是唯一的"工具栏对象",它的行为不像其他的…

我仍然想要一些关于上面的反馈(帮助别人和我自己)…

更新2 潜在的问题是在[ToolStripObject]。TabFocus财产……如果设置为false,一切似乎工作正常…将焦点放回"看起来"已经聚焦的控件。但是,让盲人用户通过标签页浏览所有UI控件是一件很方便的事情……可惜这个属性不能正常工作....

. net工具条/菜单条焦点问题

我通过重写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);
  }
}