使用ToolStripTextBox

时间:2013-02-11 21:28:54

标签: vb.net winforms

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

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

1)使用以ENTER键终止的文本框后,我想关闭一个menustrip,但我不知道如何。

我可以隐藏它:

myToolStripMenuItem.HideDropDown()

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

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

2 个答案:

答案 0 :(得分:3)

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

...
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提示非常差,只是不太容易被发现。

答案 1 :(得分:0)

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

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

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