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

标签 .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);
                }
            }
        }
    }
}

当您第一次右击表单时,没有任何显示。第二次,菜单按预期显示。是否有其他事件引发我可以更新项目?动态选择菜单项是一种不好的做法吗?

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

最佳答案

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

关于.net - 在 WinForms 中为上下文菜单动态选择菜单项的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/103514/

相关文章:

.net - double.Parse(string) 的值错误

c# - 使用 CustomAttributes 与 GetCustomAttributes() 的优势

.net - ElementHost - 重新打开窗口时空白

php - 链式选择菜单效果很好,但需要稍作调整

c# - c# 最快的序列化机制是什么?

c# - 为什么 DateTime.ToString ("dd/MM/yyyy") 给我 dd-MM-yyyy?

c# - 将 SQL 数据库存储在对象中?

winforms - 如何判断 WinForms 控件的属性是否为 "default"值?

java - ActionBar按钮不显示

python - 按下鼠标右键时 Python TKinter 文本小部件中的 Stardand 上下文菜单