为了在实际编程中使用ToolStripTextBox作为菜单项,我需要清除一些行为与我期望的不同的东西。
我的菜单条带有很少的菜单条项目,其中有一个文本框项目。
1)使用以ENTER键终止的文本框后,我想关闭一个menustrip,但我不知道如何。
我可以隐藏它:
myToolStripMenuItem.HideDropDown()
但如果我将鼠标移动然后自动打开,它会保持敏感。 我想关闭它,再次打开它需要点击。
第二,如果我使用alt键激活菜单并向下导航,当所选项目进入该文本框时,它会自动将此文本框投入到输入模式和此类块键盘导航中。
这是正常的行为吗?可以避免(比如)在输入模式下转动文本框需要SPACE或ENTER这样我可以像任何其他菜单项一样用箭头(向上/向下)传递吗?
答案 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;
然后,您可以动态地重新启用它,并在以后使用鼠标事件或按键事件使其可见。