右键单击菜单,然后指向一个类的项目

时间:2012-03-22 15:18:40

标签: c# winforms menu right-click

我希望能够右键单击图像并显示菜单。当我点击其中一个项目时,我希望它指向一个类:

    private void link1add_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
        ContextMenu cm = new ContextMenu();
        cm.MenuItems.Add("Add", HandleContextMenuAdd);
        cm.MenuItems.Add("Remove", HandleContextMenuRemove); 
        link1add.ContextMenu = cm;
        }
    }
        private void HandleContextMenuAdd(object sender, EventArgs e) 
        { 
            MessageBox.Show("Adding");
        }
        private void HandleContextMenuRemove(object sender, EventArgs e)
        {
            MessageBox.Show("Removing");
        }

自首次发布以来编辑的代码。 谢谢大家的帮助。

3 个答案:

答案 0 :(得分:1)

lambda表达怎么样?

cm.MenuItems.Add("Item 2", (_, __) => { 
  if (...) ReadDocument();
});

cm.MenuItems.Add("Item 2", (_, __) => { this.myClassInstance.DoSomething(); });

或者,您可以使用预期事件处理程序的签名创建一个方法:

cm.MenuItems.Add("Item 2", HandleContextMenuClick);

private void HandleContextMenuClick(object sender, EventArgs e)
{
  if (...) ReadDocument();
}

该方法不需要在同一个类中(例如,您可以编写this.myClassInstance.HandleContextMenuclick)。但是我会隐藏其他类的实现细节以避免不必要的耦合。

答案 1 :(得分:1)

此后您自己的代码的模式:

    public class ReadDocumentEventArgs : EventArgs
    {
        public string ImageInfo { get; set; }
    }

    public void ReadDocument(object sender, ReadDocumentEventArgs ea)
    {
        // do whatever you need to do
        MessageBox.Show(ea.ImageInfo);  // example
    }

    private void link1add_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            PictureBox imageCtrl = sender as PictureBox;

            // get the information you need to get from your control to identify it
            string imgInfo = "Hello, World!"; // example

            ContextMenu cm = new ContextMenu();
            cm.MenuItems.Add("Item 1");
            cm.MenuItems.Add("Item 2", 
               (EventHandler)((s, rde) => 
               { ReadDocument(s, new ReadDocumentEventArgs() 
                  { ImageInfo = imgInfo }); 
               }));

            link1add.ContextMenu = cm;
        }
    }

在图片上的MouseDown中,您可以使用我上面提供的代码创建一个菜单项,该代码将调用名为ReadDocument的事件处理程序。请注意,有一个ReadDocumentEventArgs类,您可以自定义该类以包含必要的属性,以帮助您识别您单击的图像。

所以,在我上面的例子中,MouseDown中发生的第一件事就是你得到了图像控件的实例(我假设它是一个Picture Box,但是你可以将它转换成它实际上的任何东西)。

此时,您可以从图像中获取文件名或其他任何内容,从表单上的其他控件中识别它。

接下来,在创建上下文菜单项时,它会告诉菜单项调用ReadDocument但传入刚刚从图像控件中获取的特殊数据。

在ReadDocument方法中,您可以随心所欲地执行任何操作。在我的示例中,我只是抛出一个MessageBox来向您显示传入的数据。

答案 2 :(得分:0)

您需要的是放置另一个事件处理程序并调用readdocument方法。