给菜单项添加点击事件

5

我创建了一个上下文菜单,当用户右键单击时会出现。我无法弄清如何在单击其中一个菜单项时调用表单。请参见下面的代码。

if (e.Button == MouseButtons.Right)
{
    ContextMenu m = new ContextMenu();
    m.MenuItems.Add(new MenuItem("New"));
    m.MenuItems.Add(new MenuItem("-"));
    m.MenuItems.Add(new MenuItem("Old"));
    m.MenuItems.Add(new MenuItem("Lost"));
    m.MenuItems.Add(new MenuItem("-"));
    m.MenuItems.Add(new MenuItem("Found"));

    switch(m.Name)
    {
        case "New":
            new FrmInfo().ShowDialog();
            break;
    }

我找不到“ContextMenu”类型,但你不能做类似这样的事情吗?m.MenuItems [ "New"] .OnClick + = OnClick; - Jerry Switalski
为什么不使用 ContextMenuStrip - Reza Aghaei
5个回答

10
你可以使用MenuItem(String, EventHandler)构造函数,它将OnClick事件处理程序作为第二个参数传递。
因此,你的代码可能看起来像这样:
m.MenuItems.Add(new MenuItem("New", MenuItemNew_Click));

...

private void MenuItemNew_Click(Object sender, System.EventArgs e)
{
    new FrmInfo().ShowDialog();
}

在这种情况下,您将如何添加子菜单项? - Hesein Burg
@HeseinBurg 就像往常一样:在将新的菜单项添加到“m.MenuItems”之前,只需填充该新菜单项的“MenuItems”集合即可。 - Andrey Korneyev

2
您可以这样做:
ContextMenu menuContainer = new ContextMenu();
var menuItem = new MenuItem("New");
menuItem.Click += Menu_Click;
menuContainer.Items.Add(menuItem);    

事件处理程序将被定义为:

void Menu_Click(object sender, RoutedEventArgs e)
{
    //here comes your code
}

这是向 System.Windows.Forms 对象添加事件处理程序的“常规”方法。有趣的是,menuItem 构造函数还接受一个参数,用于接受 clickEvent 的 EventHandler。这在 System.Windows.Forms 对象中是不寻常的。 - timothy

1
"New" 是 MenuItem 的文本属性,而不是 ContextMenu。
菜单项还有事件处理程序,因此您可以在单击特定菜单项时运行一些代码。

0

要为菜单条上的菜单项添加点击事件,可以按照以下步骤进行:

private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
    string itemText = e.ClickedItem.Text;


    switch (itemText)
    {
        case "menu name 1":
            //do stuff
            break;

        case "menu name 2":
            // do stuff
            break;
    }
}

0
从ICommand继承项目数据:
public class EscalateData : System.Windows.Input.ICommand
    {
        ITV.Misc.Msg m_react = null;
        public void Execute(object parameter)
        {
            MessageBox.Show("Hello world!");
        }
        public event EventHandler CanExecuteChanged;
        public bool CanExecute(object parameter)
        {
            return true;
        }

        public override string ToString()
        {
            return "Menu item";
        }

然后填充上下文菜单:

ContextMenu GenerateContextMenu()
{
    var ContextMenu = new ContextMenu();
    
    var escalate = new MenuItem() { Header = "Main" };
    List<EscalateData> data = new List<EscalateData>();
    data.Add(new  EscalateData());
    data.Add(new  EscalateData());
    ContextMenu.Items.Add(escalate);
    escalate.ItemsSource = data;
    return ContextMenu;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接