C# 如何创建要分配给动态菜单的onClick事件的委托?
我想执行以下操作,但收到一个错误参数类型C# 如何创建要分配给动态菜单的onClick事件的委托?,c#,winforms,delegates,menuitem,menustrip,C#,Winforms,Delegates,Menuitem,Menustrip,我想执行以下操作,但收到一个错误参数类型DoWindow不可分配给参数System.EventHandler 如何让我的委托从System.EventHandler继承 public delegate void DoWindow(MdiLayout layoutInstruction) ; private ToolStripMenuItem MakeWindowMenu() { var tsi = new ToolStripMenuItem("Window");
DoWindow
不可分配给参数System.EventHandler
如何让我的委托从System.EventHandler
继承
public delegate void DoWindow(MdiLayout layoutInstruction) ;
private ToolStripMenuItem MakeWindowMenu()
{
var tsi = new ToolStripMenuItem("Window");
tsi.DropDownItems.Add(CreateMenuItem("Cascade","Cascade the features", DoWindowLayout(MdiLayout.Cascade)));
tsi.DropDownItems.Add(CreateMenuItem("Tile Vertical","Tile the features vertically", this.DoWindowTileVertically));
//etc
return tsi;
}
private ToolStripMenuItem CreateMenuItem(string Caption, string tooltip, EventHandler onClickEventHandler)
{
var item = new ToolStripMenuItem(Caption);
item.Click += onClickEventHandler;
item.ToolTipText = tooltip;
return item;
}
public DoWindow DoWindowLayout(MdiLayout layoutInstruction)
{
Master.MDIForm.LayoutMdi(layoutInstruction);
}
自定义EventHandler需要包含所需的方法签名。换言之: ToolStripMenuItemClick需要具有签名的方法
delegate void EventHandler(object Sender, EventArgs e);
因此,您需要更改代理的签名和相应的方法
请参阅以获取进一步的参考。您可以使用
操作
作为参数,并使用匿名事件处理程序
调用操作
比如:
private ToolStripMenuItem MakeWindowMenu()
{
var tsi = new ToolStripMenuItem("Window");
tsi.DropDownItems.Add(CreateMenuItem("Cascade", "Cascade the features", () => Master.MDIForm.LayoutMdi(MdiLayout.Cascade)));
tsi.DropDownItems.Add(CreateMenuItem("Tile Vertical", "Tile the features vertically", () => { }));
return tsi;
}
private ToolStripMenuItem CreateMenuItem(string Caption, string tooltip, Action onClickEventHandler)
{
var item = new ToolStripMenuItem(Caption);
item.Click += (s, e) => { onClickEventHandler.Invoke(); };
item.ToolTipText = tooltip;
return item;
}
参数
layoutInstruction
应该从哪里来?我喜欢这个想法,但是当我尝试它时,我得到了一个错误“不兼容的匿名函数签名”,我使用的是相同的,所有的东西都编译得很好,我也测试了它,它工作正常。奇怪…我已经更新了我的答案,它删除了代理,因为它不再需要了,看看它是否在您这边编译。谢谢,它现在工作正常,而且可能第一次也工作正常-因为我正在编辑我的代码,而不是做一个完整的副本,如果我更改代理的签名以匹配,如何传递layoutInstruction参数?