如何在ToolStripMenuItem上显示ContextMenuStrip?

时间:2014-02-21 08:45:20

标签: c# winforms contextmenustrip toolstripmenu

在Winforms中,我想在用户右键单击ToolStripMenuItem时显示ContextMenuStrip。 例如(见下图),在Firefox中有Bookmarks菜单,当我们右键单击其中一个书签时,将显示一个上下文菜单项。

我们怎样才能在Windows窗体应用程序中执行此操作?

我知道我们可以将ContextMenuStrip与Control(例如Form)相关联,但问题是ToolStripMenuItem不是Control。

bookmarks-menu-in-firefox

1 个答案:

答案 0 :(得分:3)

创建自定义ContextMenuStrip并在处理ToolStripItem上的MouseUp事件时显示它,所以基本上是这样的:

    toolStripLabel1.MouseUp += new System.Windows.Forms.MouseEventHandler(toolStripLabel1_MouseUp);

    private void toolStripLabel1_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            contextMenuStrip1.Show(Cursor.Position);
        }
    }

然后,您可以根据用户点击的菜单项显示不同的上下文菜单。

<强>更新

关于您的评论,如果您不希望在显示上下文菜单时取消菜单项,则可以遍历所有工具条菜单项并将AutoClose属性设置为false(和然后在显示上下文菜单后返回true

    private void toolStripLabel1_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            AutoCloseDropDowns(menuStrip1.Items, false);
            contextMenuStrip1.Show(Cursor.Position);
            AutoCloseDropDowns(menuStrip1.Items, true);
        }
    }

    private void AutoCloseDropDowns(ToolStripItemCollection items, bool autoClose)
    {
        if (items != null)
        {
            foreach (var item in items)
            {
                var ts = item as ToolStripDropDownItem;
                if (ts != null)
                {
                    ts.DropDown.AutoClose = autoClose;
                    AutoCloseDropDowns(ts.DropDownItems, autoClose);
                }
            }
        }
    }