1

为了在实际编程中使用 ToolStripTextBox 作为菜单项,我需要清除一些行为与我预期不同的东西。

我的菜单条带有几个菜单条项,其中一个文本框项。

1)使用 ENTER 键终止使用文本框后,我想关闭菜单条,但我不知道如何。

我可以隐藏它:

myToolStripMenuItem.HideDropDown()

但是,如果我将鼠标移到上方然后自动打开,它会保持敏感。我想关闭它,再次打开它需要单击。

其次,如果我使用 alt 键激活菜单并在所选项目到达该文本框时向下导航,它会自动将此文本框置于输入模式和这样的块键盘导航。
这是正常行为吗,是否可以避免(例如)SPACE 或 ENTER 需要在输入模式下打开文本框,以便我可以像在任何其他菜单项上一样使用箭头(向上/向下)传递?

4

2 回答 2

3

我看到了问题。问题是工具条管理器的菜单仍然处于活动状态,因此鼠标悬停将再次打开菜单而不是选择它。解决这个问题非常困难,方法是内部的。您可以使用反射来破解它,如下所示:

...
using System.Reflection;

    void box_KeyDown(object sender, KeyEventArgs e) {
        if (e.KeyData == Keys.Enter) {
            e.Handled = e.SuppressKeyPress = true;
            myToolStripMenuItem.HideDropDown();
            var t = typeof(MenuStrip).Assembly.GetType("System.Windows.Forms.ToolStripManager+ModalMenuFilter", true);
            var mi = t.GetMethod("ExitMenuMode", BindingFlags.Static | BindingFlags.NonPublic);
            mi.Invoke(null, null);
        }
    }

我真的不能推荐它。我也不推荐菜单中的文本框。UI 提示很差,只是不太容易被发现。

于 2013-02-12T02:24:56.353 回答
0

我不会试图“关闭”它。相反,我会使用以下内容:

myToolStripMenuItem.Enabled = false;
myToolStripMenuItem.Visible = false;

然后您可以动态地重新启用它,并在以后通过鼠标事件或按键事件使其可见。

于 2013-02-11T21:49:37.633 回答