2013-02-11 69 views
0

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

我有几个菜单条项目,其中之一是文本项目的菜单条。

1)使用以ENTER键结束的文本框后,我想关闭一个菜单栏,但我不知道如何。

我可以将其隐藏:

myToolStripMenuItem.HideDropDown() 

但它留下来的敏感,如果我在移动鼠标,然后自动打开。 我想关闭它,点击将需要再次打开它。

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

回答

2

我看到了问题。问题在于tooltrip管理器仍然处于活动状态,因此鼠标悬停将再次打开菜单而不是选择它。解决这个问题非常困难,方法是内在的。你可以使用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提示非常差,只是不容易发现。

+0

谢谢Hansy。我在菜单中对文本框的需求非常少,所以你的黑客可以100%解决问题。你对NET的知识令人印象深刻!如果你不介意的话,请参考下一个我无法解决的问题。 http://stackoverflow.com/questions/14826304/using-autocomplete-mode-in-input-controls – 2013-02-12 05:55:55

0

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

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

然后你就可以动态地重新启用它,让它可见以后是否用鼠标事件或按键事件。

+0

然后,你将不必再次点击菜单,因为它将被隐藏:) – 2013-02-11 21:53:45

+0

这是你想要发生什么? – tmwoods 2013-02-12 05:04:33

+0

不,我只想关闭下拉菜单并将菜单设置为非活动状态,就像您在打开的菜单之外单击时自动发生的一样。 – 2013-02-12 18:15:13