如何关闭设置为autoclose = false的toolstripmenuitem?

时间:2013-07-31 19:59:17

标签: c# winforms toolstripdropdown toolstripmenu

我有一个用户可以切换的项目菜单。我希望菜单保持打开状态,以便用户可以检查他们想要的所有项目。我设置autoclose = false,现在效果很好。但是,我现在也无法关闭窗口lol。我尝试点击菜单上的表格,点击逃脱,点击菜单项,点击菜单的keycombo,没有任何作用。

理想情况下,我希望用户能够只是单击表单或基本上除菜单之外的任何内容关闭它或按下转义。我怎么做到这一点?我尝试在表单上创建一个gotfocus事件,并在那里执行item.HideDropDown但没有骰子。

谢谢!

2 个答案:

答案 0 :(得分:1)

为表单生成click事件,然后对每个没有自己的click事件的控件进行操作,将其click事件设置为表单的事件。

如果遇到隐藏菜单的代码:toolStripDropDownButton.HideDropDown();

将代码复制到其他控件的任何现有点击事件。

这是我在单击表单上的任何位置时隐藏月份日历的方式。

如果你还想包括按下escape作为选项,请使用KeyDown事件做同样的事情,在运行代码之前检查它是否是转义键。

答案 1 :(得分:0)

我有类似的问题,这是我的解决方案。 我创建了常见的MouseEnter和MouseLeave事件处理程序,并在鼠标离开后使用计时器延迟关闭菜单。

以下是3个项目和1个分隔符菜单的示例代码。在示例中,2个项目使用AutoClose,其中一个(_modeChangingItem)不关闭菜单。您可以根据需要轻松自定义,例如没有任何项目AutoClose。

private Timer _menuTimer = new Timer();

private void MainFrm_Load (object sender, EventArgs e)
{
    _menuTimer.Interval = 200;
    _menuTimer.Tick += _menuTimer_Tick;

    _rootMenuItem.MouseEnter += commonMenu_MouseEnter;
    _rootMenuItem.MouseLeave += commonMenu_MouseLeave;

    _menuItem1.MouseEnter += commonMenu_MouseEnter;
    _menuItem1.MouseLeave += commonMenu_MouseLeave;
    _menuItem2.MouseEnter += commonMenu_MouseEnter;
    _menuItem2.MouseLeave += commonMenu_MouseLeave;
    _separator.MouseEnter += commonMenu_MouseEnter;
    _separator.MouseLeave += commonMenu_MouseLeave;
    _modeChangingItem.MouseEnter += commonMenu_MouseEnter;
    _modeChangingItem.MouseLeave += commonMenu_MouseLeave;

}

private void commonMenu_MouseLeave(object sender, EventArgs e)
{
    _menuTimer.Stop();

    // Comment this line out if you want none of the items to AutoClose 
    _rootMenuItem.DropDown.AutoClose = true;

    ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
    if (menuItem != null) menuItem.Tag = null;
    ToolStripSeparator separator = sender as ToolStripSeparator;
    if (separator != null) separator.Tag = null;
    _menuTimer.Start();
}

private void commonMenu_MouseEnter(object sender, EventArgs e)
{
    ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
    if (menuItem != null) menuItem.Tag = new object();
    ToolStripSeparator separator = sender as ToolStripSeparator;
    if (separator != null) separator.Tag = new object();
}

private void _menuTimer_Tick(object sender, EventArgs e)
{
    if (_rootMenuItem.Tag == null && _menuItem1.Tag == null &&
                                     _menuItem2.Tag == null &&
                                     _separator.Tag == null &&
                                     _modeChangingItem.Tag == null)
    {
        _rootMenuItem.DropDown.Close();
    }
    _menuTimer.Stop();
}

private void _modeChangingItem_Click(object sender, EventArgs e)
{
    ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
    if (menuItem == null) return;

    // Move this line to Form_Load if you want none of the items AutoClose 
    _rootMenuItem.DropDown.AutoClose = false; // Now the menu stays opened

    [...]
}

此解决方案为用户节省了额外的点击次数 - 当您将鼠标移到所有项目之外时,计时器会关闭菜单。