鼠标离开ToolStripMenuItems时关闭ToolStripMenuItem

时间:2017-03-15 01:21:25

标签: winforms mouseevent toolstrip toolstripmenu toolstripdropdown

我是Windows Forms的新手,所以我想知道问题的最佳方法是什么。

我希望ToolStripDropDownMenu的ToolStripMenuItems仅在用户的鼠标离开包含它们的区域时关闭(所有ToolStripMenuItems)

目前我有以下代码:

             {  ToolStripDropDownMenu menu = new ToolStripDropDownMenu();
                menu.AutoClose = true;

                foreach (ToolStripMenuItem toolStripItem in this.collectionToolStripMenuItems)
                {
                    menu.Items.Add(toolStripItem);
                }

                menu.Show(sender, e.ControlLocation);
            }

我在列表中定义toolStripMenuItems:collectionToolStripMenuItems,代码为:

            ToolStripMenuItem ToolStripItem = new ToolStripMenuItem(item.Name);
            ToolStripItem.Click += new EventHandler(this.ValueMenuItem_Click);
            ToolStripItem.MouseLeave += new EventHandler(MouseLeave);
            ToolStripItem.MouseEnter += new EventHandler(MouseEnter);

其中

    private void MouseLeave(object sender, EventArgs e)
    {
        ToolStripMenuItem item2 = (ToolStripMenuItem)sender;
        ToolStripDropDownMenu menu = (ToolStripDropDownMenu)item2.Owner;
        menu.Hide();
    }

    private void MouseEnter(object sender,EventArgs e)
    {
        ToolStripMenuItem item2 = (ToolStripMenuItem)sender;
        ToolStripDropDownMenu menu = (ToolStripDropDownMenu)item2.Owner;
        menu.Show();
    }

    private void ValueMenuItem_Click(object sender, EventArgs e)
    {// Do something
        ToolStripMenuItem item2 = (ToolStripMenuItem)sender;

            ToolStripDropDownMenu menu = (ToolStripDropDownMenu)item2.Owner;
            menu.Show();

            return;
    }

但是每当用户点击或离开toolStripMenuItem时,dropDown会关闭一小段时间,所以看起来整个事情都在闪烁。

有人可以推荐更好的方法吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

我正面临类似的问题。让我分享整个解决方案。让toolStripMenuItem成为我们的ToolStripMenuItem对象。

在Form1.Designer.cs之外执行此操作:

  1. 将“自动关闭”设置为false toolStripMenuItem.DropDown.AutoClose = false;
  2. 添加一个新的事件处理程序,当鼠标离开下拉菜单toolStripMenuIntem.DropDown.MouseLeave += System.EventHandler(this.DropDown_MouseLeave)时,该事件处理程序将关闭下拉菜单。

您当然需要创建此事件处理程序:

    private void DropDown_MouseLeave(object sender, EventArgs e)
    {
        // Close DropDown when mouse leave drop down control:          
        toolStripMenuItem.DropDown.Close();
    }

上面的解决方案是局部的。当鼠标离开toolStripMenuItem控件本身时,您可能还需要关闭下拉菜单。为此,我要做的是在鼠标离开toolStripMenuItem控件时检查鼠标是否在下拉菜单中。如果鼠标在toolStripMenuItem之外并且在下拉菜单之外,那么我将关闭下拉菜单。

private void ToolStripMenuItem_MouseLeave(object sender, EventArgs e)
{
        Point cursor = toolStripMenuItem.DropDown.PointToClient(Control.MousePosition);
        bool cursorInDropDown = toolStripMenuItem.DropDown.ClientRectangle.Contains(cursor);

        if (!cursorInDropDown)
        {
            // Cursor is NOT in drop down. Close Drop down!
            toolStripMenuItem.DropDown.Close();
        }
    }

请记住将toolStripMenuItem对象的事件MouseLeave链接到ToolStripMenuItem_MouseLeave

希望有帮助!