我在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),没有参考
和
while
或foreach
循环解决方案不是最佳方法。
谢谢:)
答案 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
而不是菜单保留的内容)中的项目。