在WinForms中为上下文菜单动态选择菜单项的正确方法是什么?

时间:2008-09-19 16:34:21

标签: .net winforms menu

我正在尝试为与主菜单项“链接”的控件创建上下文菜单。有两个固定的菜单项总是在那里,可能需要在菜单上添加任意数量的附加菜单项。

我尝试通过保持对固定菜单项的类级引用和动态菜单项列表来解决问题。我通过清除当前的项目列表,然后将相应的项目添加到菜单来处理两个菜单的Opening事件。这适用于主菜单,但上下文菜单表现奇怪。

主要问题似乎是,当Opening被提出时,菜单已经决定了要显示的项目。此表格证明:

using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class DemoForm : Form
    {
        private List _items;

        public DemoForm()
        {
            var contextMenu = new ContextMenuStrip();
            contextMenu.Opening += contextMenu_Opening;

            _items = new List();
            _items.Add(new ToolStripMenuItem("item 1"));
            _items.Add(new ToolStripMenuItem("item 2"));


            this.ContextMenuStrip = contextMenu;
        }

        void contextMenu_Opening(object sender, CancelEventArgs e)
        {
            var menu = sender as ContextMenuStrip;

            if (menu != null)
            {
                foreach (var item in _items)
                {
                    menu.Items.Add(item);
                }
            }
        }
    }
}

第一次右键单击表单时,不显示任何内容。第二次,菜单按预期显示。在我可以更新项目的地方是否还有其他事件?动态选择菜单项是不好的做法吗?

注意:这是一个例子,我开始为想要这种功能的人开始制作,我很好奇它有多难,所以我无法提供有关为什么要这样做的细节。这个人想要的将一个主菜单项“链接”到上下文菜单,由于菜单项只能是单个菜单的子项,这似乎是一种合理的方法。欢迎任何替代方法建议。)< / p>

1 个答案:

答案 0 :(得分:2)

您可以在控件的MouseDown事件期间计算出项目。检查它是否也是鼠标右键。