有没有办法在单击菜单时停止菜单关闭?

时间:2015-12-02 03:24:27

标签: c# .net winforms

我们的程序中有一个表单,允许用户通过使用菜单栏确定用户在设置权限时可以看到的内容。当用户点击某个项目时,该项目将被“选中”(旁边有一个勾号)。但是,这也会关闭菜单。

enter image description here

当用户点击此菜单时,是否有办法停止此菜单关闭(不影响程序中的任何其他菜单)?到目前为止,我还没有在设置中找到任何内容,任何_click方法也不会影响它。

4 个答案:

答案 0 :(得分:2)

我是一个黑客,但我会为你点击的每个项目执行此操作:

 sampleNameToolStripMenuItem.ShowDropDown();

这样一旦你点击某个东西,它也会在你之后再次放下菜单。

答案 1 :(得分:1)

我有一个类似的问题。在我的情况下,要检查的项目为“低级”。

我通过在ToolStripMenuItems中添加一个MouseEnter和MouseLeave事件来解决它。

在MouseEnter中,将两个menuItem的AutoClose设置为false-在MouseLeave中,将其设置为true。

Visualization of the issue I had

 private void AddEventToToolStripMenuItems(IEnumerable<ToolStripMenuItem> menuItems)
        {
            // listen all menuItems
            foreach (ToolStripMenuItem menuItem in menuItems)
            {
                menuItem.MouseEnter += OnToolStripMouseEnter;
                menuItem.MouseLeave += OnToolStripMouseLeave;
            }
        }

       private void OnToolStripMouseEnter(object sender, EventArgs e)
        {
            firstLevelTooStipMenuItem.DropDown.AutoClose = false;
            secondLevelTooStipMenuItem.DropDown.AutoClose = false;
        }

        private void OnToolStripMouseLeave(object sender, EventArgs e)
        {
            firstLevelTooStipMenuItem.DropDown.AutoClose = true;
            secondLevelTooStipMenuItem.DropDown.AutoClose = true;
        }

答案 2 :(得分:0)

答案 3 :(得分:0)

ToolStripDropDownClosingEventHandler中出现的ToolStripDropDown。为此,只需访问 ToolStripMenuItem.DropDown 属性,然后添加将处理 Closing 事件的侦听器。我们只需要检查鼠标指针是否在toolStrip矩形内,这可以通过以下代码完成:

private void ListenToolStripMenuItems(IEnumerable<ToolStripMenuItem> menuItems)
{
    // listen all menuItems
    foreach (ToolStrip menuItem in menuItems)
        menuItem.DropDown.Closing += OnToolStripDropDownClosing;
}

private void OnToolStripDropDownClosing(object sender, ToolStripDropDownClosingEventArgs e)
{
        var tsdd = sender as ToolStripDropDown;      // casting

        // checking if mouse it's inside
        Point p = tsdd.PointToClient(MousePosition);  
        if (tsdd.DisplayRectangle.Contains(p))
            e.Cancel = true;  // cancel closing
}

这样,“自动关闭”仍然可以正常工作,并且工具条也将正确关闭。