【问题标题】:.Net Toolstrip/MenuStrip Focus Issues.Net Toolstrip/MenuStrip 焦点问题
【发布时间】:2012-12-23 16:09:38
【问题描述】:

无论情况如何,我都能 100% 地重现这个烦人的问题。 创建一个 .Net 项目、C# 或 VB.Net。将 ToolStrip 控件添加到窗体。创建一些包含至少 2 个菜单项的简单 DropDownButton(s)。添加您希望的任何其他控件、一个列表框(填充它以便它可以正确接收焦点)和一个 ComboBox 控件。分配快捷键或在 ToolStrip 上启用 TabStop 以便它可以通过键盘接收焦点。

运行项目(调试/发布,随心所欲)。使用键盘为 ToolStrip 提供焦点(通过选项卡或快捷键)。向下箭头进入子项。现在选择退出键以折叠工具条子菜单。 Tab 到包含一些项目的列表框或组合框。 一切看起来都很棒对吧?现在使用箭头键在这些控件中导航...惊喜!你回到 ToolStrip 上,而你认为​​有焦点的控件却没有!

我尝试了多种方法来强制将注意力集中在 ListBox 上。一个例子是我为 OnEnter (ListBox.Enter+=...) 添加事件处理程序并添加一些代码,例如:

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

没有什么是成功的...似乎一旦菜单在工具条上展开,您将永远停留在使用键盘的此控件上... 这对我来说很重要,因为我与只使用键盘导航的盲人用户一起工作......这是一个错误吗?我无法在 MFC 中重现它...

有什么建议吗?

更新 我能够找到一个不会重现这种奇怪的控件......

System.Windows.Forms.MainMenu 是唯一与其他“工具栏对象”不同的“工具栏对象”...

不过,我仍然希望对上述内容提供一些反馈(对他人和我自己的帮助)...

更新 2 根本问题在 [ToolStripObject].TabFocus 属性中...如果设置为 false ,一切似乎都可以正常工作...将焦点返回给“看起来”像已聚焦的控件。但是,拥有允许盲人用户通过选项卡浏览所有 UI 控件的功能是一个很容易实现的东西......太糟糕了,这个属性不能像它应该的那样工作......

【问题讨论】:

    标签: c# winforms menu focus toolstrip


    【解决方案1】:

    我通过覆盖 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);
      }
    }
    

    【讨论】:

    • 嗨 Lars,我刚刚实现了您的子类 ToolStripMenuItem 与我需要在上面发布的场景(基本上需要打开 TabStop)并且实际上最终再次被困在工具栏上......你确定你的工具栏对象的 TabStop 属性设置为 true?
    • 关闭菜单项不是问题的一部分,在正常情况下按下退出键时它们会很好地折叠。
    • @Don 是的,我的 ToolStrip 上有 TabStop = true。我按照您描述的方式创建了一个表单,发现一旦您尝试从 ToolStrip 下拉菜单中退出,箭头键基本上就像 Tab 键一样。发布的代码是我项目中唯一的代码,它使它对我有用。如果您对该函数返回 true,则关闭菜单会成为一个问题(或应该),这就是我手动隐藏它的原因。
    • ahhh...您在发布的代码中犯了一个错误...如果 tb != null 则返回 true...我将其更改为 false 并且有效...我需要尝试一些事情
    • @Don 嗯,看起来tb.HideDropDown(); 可以解决问题。我注释掉了return true; 行,它仍然有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多