2012-02-19 69 views
0

正如你所看到的系统菜单,他们有这样的语法:系统菜单和委托

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到operates.in这种情况下,我已经过了“新”一个功能。

我不想写10个或更多的处理程序,我只想写一个处理程序与许多事件参数。

+1

线所有的菜单项的使用相同的处理方法,然后用' sender'参数来区分哪个菜单项引发了该事件。将其从“System.Object”转换为“MenuItem”。 – 2012-02-19 09:05:00

回答

1

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

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

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

之后,你可以把它添加到您的菜单:

fileMenuItem.MenuItems.Add(menuItem1); 
+0

我不想制作很多处理程序方法。我只想用一个处理器方法来处理很多事件参数! – sap 2012-02-19 07:09:45

+0

如果您试图为许多按钮按下一个处理程序,那么您应该使用正在传递的“sender”对象作为参数来指示哪个按钮已被按下。通过这种方式,您可以在全局处理程序中确定基于所按按钮执行的操作。如果这是你想达到的。您可以为每个按钮分配所需的信息(例如,在您的示例中,您为该按钮分配了“新建”)。 – 2012-02-19 07:51:11

1

EventArgs参数的值是由触发事件,这是在这种情况下MenuItem提供的对象。因此,处理一个处理程序中多个MenuItem对象的OnClick事件的唯一方法是使用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 
    } 
}