Доступ к MenuItemCollection на основе текста заголовка - PullRequest
1 голос
/ 08 июня 2011

Я использую ContextMenu и добавил Menu к MenuItems MenuItemCollection, выполнив следующие действия:

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 на основе названия заголовка, поскольку именно так он добавлен.

Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 21 июня 2017

У меня была похожая проблема. Мы не можем идти по заголовку, мы должны перечислить пункты и сравнить текст.

            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;
                }
            }
0 голосов
/ 09 июня 2011

Вы можете попробовать (я предполагаю, C # 3 или выше)

mContextMenu.MenuItems.Cast<MenuItem>().FirstOrDefault(i=>i.Text == text);

В соответствующей заметке я не знаю, каковы ваши намерения, но вы можете взглянуть на свойство Tag в MenuItem. Он специально предназначен для хранения личных данных, поэтому вам не нужно полагаться на заголовки или словари для хранения информации.

0 голосов
/ 08 июня 2011

Вы не можете сделать это, используя существующий API - вы должны проявить творческий подход.Я знаю, что это имеет смысл, потому что это то, как вы вызываете конструктор, но это просто способ сэкономить ваше время при создании новых MenuItems, а не то, как он организован внутри.

Я мог бы поддерживать System.Collections.Generic.Dictionaryчьи ключи являются строками заголовков, а значения являются ссылками на объекты MenuItem, затем создайте функцию-обертку, которая добавляет пункт меню в меню и словарь.Удаление этих словарных статей при изменении пунктов меню - это другое упражнение.

...