我正在使用ContextMenu
并通过执行以下操作向MenuItems
MenuItemCollection
添加了一些Menu
:
private const string ADD_MENU_ITEM = "Add";
private const string REMOVE_MENU_ITEM = "Remove";
...
mContextMenu.MenuItems.Add(ADD_MENU_ITEM, new EventHandler(...));
mContextMenu.MenuItems.Add(REMOVE_MENU_ITEM, new EventHandler(...));
...
现在稍后,我想根据标题文字访问Menu
中的MenuItemCollection
。所以像这样:
Menu m = mContextMenu.MenuItems[ADD_MENU_ITEM]; // This doesnt work
我知道我可以使用索引,但我觉得应该有一种方法可以根据标题名称获取Menu
,因为这是它的添加方式。
我该怎么做?
答案 0 :(得分:1)
我有类似的问题。 我们不能通过标题,我们必须枚举项目并比较文本。
var enumerator = node.ContextMenu?.MenuItems?.GetEnumerator();
while ((bool)enumerator?.MoveNext())
{
var item = (MenuItem)enumerator.Current;
if (item.Text == command)
{
var menuItemCollection = item.MenuItems;
menuItemCollection.Remove(item);
break;
}
}
答案 1 :(得分:0)
您无法使用现有API执行此操作 - 您必须具有创造性。我知道这是有道理的,因为这就是你如何调用构造函数,但这只是他们在制作新的MenuItem时节省时间的方式,而不是内部组织方式。
我可能会维护一个System.Collections.Generic.Dictionary,其键是标题字符串,值是对MenuItem对象的引用,然后创建一个包装函数,将菜单项添加到菜单和Dictionary中。当菜单项改变时删除那些词典条目是一个不同的练习。
答案 2 :(得分:0)
你可以尝试(我假设C#3或更高)
mContextMenu.MenuItems.Cast<MenuItem>().FirstOrDefault(i=>i.Text == text);
在相关的说明中,我不知道您的意图是什么,但您可能需要查看Tag
中的MenuItem
属性。是专门用于存储私人数据,以便您不必依赖字幕或词典来存储信息。