我希望能够右键单击图像并显示菜单。当我点击其中一个项目时,我希望它指向一个类:
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");
}
自首次发布以来编辑的代码。 谢谢大家的帮助。
答案 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
方法。