C# - 将ContextMenuStrip项复制到另一个项中

时间:2016-06-17 15:03:14

标签: c# .net winforms contextmenustrip

我在Windows窗体应用程序中有两个ContextMenuStrip,其中一个有3个项目,另一个没有。

我们假设:

ContextMenuStrip c1 = new ContextMenuStrip();
ContextMenuStrip c2;

c1有3 ToolStripMenuItems,c2是ContextMenuStrip目的地,其中c1项应该重复。

我试着写这个:

c2 = new ContextMenuStrip(c1.Container);

但它为我ArgumentNullException,因为c1.Container等于null

我无法弄清楚如何解决这个问题,你能帮助我吗?

聚苯乙烯。 我会new ToolStripMenuItem(s),没有参考

whileforeach循环解决方案不是最佳方法。

谢谢:)

3 个答案:

答案 0 :(得分:1)

然后,有一个创建ContextMenuStrip的函数,并在每次需要新菜单时调用它

Func<ContextMenuStrip> newContextMenuStrip = () => { 
    var c = new ContextMenuStrip();
    c.Items.Add("item 1");
    c.Items.Add("item 2");
    c.Items.Add("item 3");
    return c;
};

var c1 = newContextMenuStrip();
var c2 = newContextMenuStrip();

答案 1 :(得分:1)

晚会,但我过去遇到过同样的问题,并找到了一个相当简单的解决方案。

假设您的toolStripMenuItem被声明为&#39; TSMI_open&#39;在上下文菜单中, 您可以在打开时在上下文菜单之间有效地进行热交换。 像这样:

void Context1_Opening(object sender, CancelEventArgs e)
{
     Context1.Items.Insert(0, TSMI_open);
}

void Context2_Opening(object sender, CancelEventArgs e)
{
     Context2.Items.Insert(0, TSMI_open);
}

菜单项将无缝地显示在两个菜单上,如果连续两次打开相同的菜单,则不会出现错误。

答案 2 :(得分:0)

您需要创建一个新的ContextMenuStrip并将Item(而不是Container c1添加到新菜单中:

c2 = new ContextMenuStrip();
c2.Items.AddRange(c1.Items);

但请注意,这不会重复项目。 相同的项目实例现在位于两个菜单中。

如果要克隆它们,这是相当复杂的,因为您必须处理项目的特定类型,要克隆的属性,尤其是事件处理程序。

一个简单的例子可能是:

c2.Items.AddRange(c1.Items.OfType<ToolStripItem>()
                           .Select(item => new ToolStripMenuItem(item.Text))
                           .OfType<ToolStripItem>().ToArray());

第二个OfType是必要的,以避免ToolStripMenuItem[]期望的ToolStripItem[]AddRange()的共变数组转换。

旁注:Container包含菜单的组件(当菜单未显示时为null而不是菜单保留的内容)中的项目。