Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建要分配给动态菜单的onClick事件的委托?_C#_Winforms_Delegates_Menuitem_Menustrip - Fatal编程技术网

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参数?