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

时间:2020-03-06 14:26:49  来源:igfitidea点击:

我正在尝试为"链接"到主菜单项的控件制作上下文菜单。有两个固定菜单项始终存在,并且菜单上可能需要任意数量的其他菜单项。

我尝试通过对固定菜单项和动态菜单项列表进行类级引用来解决此问题。我正在通过清除当前项目列表,然后将适当的项目添加到菜单来处理两个菜单的" 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);
                }
            }
        }
    }
}

当我们第一次用鼠标右键单击该窗体时,将不显示任何内容。第二次,菜单按预期显示。是否还有另一个事件可以更新项目?动态选择菜单项不是一个好习惯吗?

(请注意:这是一个示例,我开始为需要此类功能的人制作,但我对它的难度感到好奇,因此我无法提供执行此操作的详细信息。此人想"链接"主程序菜单项到上下文菜单中,并且由于菜单项只能是单个菜单的子级,因此这似乎是一种合理的方法。欢迎对此方法提出其他建议。

解决方案

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