【问题标题】:ToolStripMenuItem not in visible area when selected/highlighted选择/突出显示时 ToolStripMenuItem 不在可见区域
【发布时间】:2013-10-23 07:12:10
【问题描述】:

我有一个 ContextMenuStrip,其中包含动态生成的 ToolStripMenuItems 的子菜单。最多有 80 个子菜单项。按所需菜单项的第一个字母会正确选择它,但如果该项目恰好超出可见范围(在滚动箭头处理的范围内),则不会显示 - 用户必须按向上箭头然后在屏幕上显示并聚焦所需选项的向下箭头。

例如,我有 6 个以“m”开头的项目,但只有 3.5 个可见。我按 m 一个,第一个项目突出显示,我再按 m 3 次,我可以看到半个选定的行(它在可见区域的底部),再按 m 两次,我看不到选择行,然后再 m 一次,第一个 m 条目可见并再次被选中。

默认情况下 ToolStripMenuItems (TSMI) 没有可用的关键侦听器,但是如果我将 TSMI 子类化,我可以捕获 ProcessDialogKey 和 ProcessCmdKey 并手动选择正确的选项,但我无法向下滚动工具条子菜单以确保我的选项可见。

关于如何操作的任何提示:

a) 滚动工具条的子菜单

b) 允许子菜单使用多列(并希望用户的分辨率不会低得离谱)。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    您是否尝试过ContextMenuStrip 上的KeyPress 事件?您可能能够检测到更改所选项目的按键,然后使用每个项目的ToolStripMenuItem.Selected 属性来确定选择了哪一个。然后在ContextMenuStrip 上使用AutoScrollOffset 将项目滚动到视图中。

    或者,您可以改用旧的 ContextMenu 控件 - 它的项目具有 Select 事件。

    【讨论】:

    • CMS 上的 KeyPress 事件不会为子菜单触发。我可以捕获 ProcessDialogKey 并选择正确的元素,但是在正确的元素上执行“选择”不会向下滚动子菜单以显示所选项目。 AutoScrollOffset 似乎不适用于子菜单
    • 由于 ContextMenuStrip 是从 ScrollableControl 派生的(忽略它被隐藏的事实),您是否尝试将 AutoScroll 设置为 true?
    • 我收到 NotsupportedException “ToolStrip 不支持 AutoScroll 属性。”当我尝试在 ContextMenuStrip 或有问题的 ToolStripMenuItem 上设置 AutoScroll 属性时。
    【解决方案2】:

    我遇到了这个问题。我不记得确切的解决方案(如果找不到,请告诉我),但基本上,ToolStripMenu 具有“最顶层项目索引”的属性。

    只需将新选择的项目(例如第 4 个“m”)设置为最顶部的项目索引,其余的将由 WinForms 处理。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2020-12-14
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多