首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个ContextMenuStrip的ToolStripMenuItem

多个ContextMenuStrip的ToolStripMenuItem
EN

Stack Overflow用户
提问于 2011-11-29 16:48:30
回答 2查看 4.5K关注 0票数 2

我有一个表单,其中包含选项卡面板与许多点击页面。它们中的每一个都有自己的上下文菜单(右键单击时显示)。但是如果我将一个ToolStripMenuItem添加到多个ContextMenuStrips中,只有最后一个菜单条才真正有这个菜单项。简单的代码示例如下:

代码语言:javascript
复制
    ToolStripMenuItem tim_refresh = new ToolStripMenuItem("Refresh", null, (o, e) =>
        {
            MessageBox.Show("Refresh");
        });

    ContextMenuStrip cms1 = new ContextMenuStrip();
    cms1.Items.Add(tim_refresh);

    ContextMenuStrip cms2 = new ContextMenuStrip();
    cms2.Items.Add(tim_refresh);

    this.tblDataManagerObjects.ContextMenuStrip = cms1;
    this.tblDataSourceTypes.ContextMenuStrip = cms2;

如果一个接一个地显示这个菜单,第一个将是empty...How我能实现我想要的吗?

EN

回答 2

Stack Overflow用户

发布于 2011-11-29 16:56:49

这是因为视觉不能同时是多个不同视觉对象的子对象。在您的示例中,tim_refresh同时是cms1cms2的子级。

您需要创建两个完全独立的ToolStripMenuItem实例。

编辑:

您可以提取可视化创建in factor方法来简化多个对象的实例化:

代码语言:javascript
复制
private ToolStripMenuItem CreateToolStripMenuItem(string name)
{
   return new ToolStripMenuItem(name, null, (o, e) =>
        {
            MessageBox.Show(name);
        });
}

// then just call it once per each menu strip
ContextMenuStrip cms1 = new ContextMenuStrip();
cms1.Items.Add(CreateToolStripMenuItem("Refresh"));

ContextMenuStrip cms2 = new ContextMenuStrip();
cms2.Items.Add(CreateToolStripMenuItem("Refresh"));
票数 1
EN

Stack Overflow用户

发布于 2013-12-18 10:39:46

一个上下文菜单一次只显示一次;你可能不需要很多克隆,但你可能想要在菜单条打开时将菜单项的一个实例移动到菜单条上;

当本地副本为空时,我将在此处将命名的(大)父菜单项移动到子(当前打开的)菜单,并且所有下一个ctx打开的位置我只是AddRange,这将“定位”的三个菜单项从先前打开的ctxMenuStrip移动到当前打开的菜单项:

代码语言:javascript
复制
    // http://stackoverflow.com/questions/8307959/toolstripmenuitem-for-multiple-contextmenustrip?rq=1
    // http://stackoverflow.com/questions/6275120/toolstripmenuitem-added-to-several-places?rq=1
    // WILL_ADD_PARENT_MENU_ITEMS_IN_Opening first time opened we locate common menu items from GrandParent, then we move them to the current slider; cool?
    private static ToolStripItem[] separatorLoadSave = null;
    private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) {
        if (separatorLoadSave == null) {
            separatorLoadSave = new ToolStripItem[3];

            Control slidersAutoGrow = base.Parent;
            if (base.Parent.Name != "SlidersAutoGrow") return;
            Control slidersForm = slidersAutoGrow.Parent;
            if (slidersForm.Name != "SlidersForm") return;

            ToolStripItem[] separator = slidersForm.ContextMenuStrip.Items.Find("toolStripSeparator1", false);
            if (separator.Length > 0) separatorLoadSave[0] = separator[0];

            ToolStripItem[] load = slidersForm.ContextMenuStrip.Items.Find("mniParameterSetLoad", false);
            if (load.Length > 0) separatorLoadSave[1] = load[0];

            ToolStripItem[] save = slidersForm.ContextMenuStrip.Items.Find("mniParameterSetSave", false);
            if (save.Length > 0) separatorLoadSave[2] = save[0];
        }

        this.contextMenuStrip1.SuspendLayout();
        this.contextMenuStrip1.Items.AddRange(separatorLoadSave);
        this.contextMenuStrip1.ResumeLayout();
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8307959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档