我有一个表单,其中包含选项卡面板与许多点击页面。它们中的每一个都有自己的上下文菜单(右键单击时显示)。但是如果我将一个ToolStripMenuItem添加到多个ContextMenuStrips中,只有最后一个菜单条才真正有这个菜单项。简单的代码示例如下:
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我能实现我想要的吗?
发布于 2011-11-29 16:56:49
这是因为视觉不能同时是多个不同视觉对象的子对象。在您的示例中,tim_refresh同时是cms1和cms2的子级。
您需要创建两个完全独立的ToolStripMenuItem实例。
编辑:
您可以提取可视化创建in factor方法来简化多个对象的实例化:
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"));发布于 2013-12-18 10:39:46
一个上下文菜单一次只显示一次;你可能不需要很多克隆,但你可能想要在菜单条打开时将菜单项的一个实例移动到菜单条上;
当本地副本为空时,我将在此处将命名的(大)父菜单项移动到子(当前打开的)菜单,并且所有下一个ctx打开的位置我只是AddRange,这将“定位”的三个菜单项从先前打开的ctxMenuStrip移动到当前打开的菜单项:
// 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();
}https://stackoverflow.com/questions/8307959
复制相似问题