【问题标题】:Close ToolStripMenuItem when mouse leaves ToolStripMenuItems鼠标离开 ToolStripMenuItems 时关闭 ToolStripMenuItem
【发布时间】:2017-08-05 14:08:18
【问题描述】:

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

我希望 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 时,下拉菜单都会关闭很短的时间,因此看起来整个东西都在闪烁。

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

【问题讨论】:

标签: winforms mouseevent toolstrip toolstripmenu toolstripdropdown


【解决方案1】:

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

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

  1. 将自动关闭设置为 falsetoolStripMenuItem.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

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    相关资源
    最近更新 更多