系统菜单和代表

时间:2012-02-19 06:52:42

标签: c# c#-4.0 delegates event-handling

正如您所看到的系统菜单,它们的语法如下:

MainMenu mainMenu = new MainMenu();
MenuItem fileMenuItem = new MenuItem("File");

mainMenu.MenuItems.Add(fileMenuItem);
this.Menu = mainMenu;

要为Click事件编写事件,我可以这样做吗?怎么样?

fileMenuItem.MenuItems.Add(new MenuItem("New",
MyMenuItemEventArgs(this, new MyMenuItemEventArgs("New")))

所以在MyMenuItemEventArgs中,我可以将我的opearion传递给一个操作的函数。在这种情况下,我已经通过了'New'。

我不想编写10个或更多处理程序,我只想编写一个包含许多Event args的处理程序。

2 个答案:

答案 0 :(得分:1)

您应该实例化一个新的menuItem,然后使用Click属性添加处理程序。

MenuItem menuItem1=new MenuItem("Item text");

menuItem1.Click += new System.EventHandler(handler_method);

之后,您可以将其添加到菜单中:

fileMenuItem.MenuItems.Add(menuItem1);

答案 1 :(得分:1)

EventArgs参数的值由触发事件的对象提供,在这种情况下为MenuItem。因此,在一个处理程序中处理多个OnClick对象的MenuItem事件的唯一方法是使用sender参数。您可以使用以下代码检查单击了哪个菜单项:

var mainMenu = new MainMenu();
var fileMenuItem = new MenuItem("file");
var openMenuItem = new MenuItem("open", OnClick);
var exitMenuItem = new MenuItem("exit", OnClick);

openMenuItem.Name = "open";
exitMenuItem.Name = "exit";

fileMenuItem.MenuItems.Add(openMenuItem);
fileMenuItem.MenuItems.Add(exitMenuItem);

mainMenu.MenuItems.Add(fileMenuItem);
this.Menu = mainMenu;

在事件处理程序中:

private void OnClick(object sender, EventArgs eventArgs)
{
    var senderName = ((MenuItem) sender).Name;
    if (senderName == "open")
    {
        //open was clicked
    }
    else if (senderName == "exit")
    {
        //exit was clicked
    }
}