1

我是 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 时,这都会起作用,dropDown 会在很短的时间内关闭,因此看起来整个东西都在闪烁。

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

4

1 回答 1

0

我面临着类似的问题。让我分享整个解决方案。让 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.

希望能帮助到你!

于 2020-04-15T13:55:42.527 回答