#c# #gtk#
#c# #gtk#
Вопрос:
Я пытаюсь добавить элементы в контекстное меню текстового представления в GtkSharp (версия 3.22.25.128). Контекстное меню обычно содержит записи Вырезать/Копировать/Вставить/Удалить/Разделитель/Выбрать все/Вставить смайлики. Я пытаюсь добавить еще несколько записей в меню, начиная с разделителя.
Для этого я добавляю обработчик в событие PopulateMenu, например:
_textBox.PopulatePopup = (object source, PopulatePopupArgs args) =gt; { if (args.Popup is Menu menu) { (menu.Children[0] as MenuItem).Activated = (object src, EventArgs a) =gt; { Setting.SetRaw("This happened"); }; foreach (var item in GetPopupMenuItems()) { menu.Add(item); } } };
Сокращенная версия GetPopupMenuItems() является:
IEnumerablelt;MenuItemgt; GetPopupMenuItems() { yield return new SeparatorMenuItem(); var importMenuItem = new MenuItem("Import single value from text file"); importMenuItem.Activated = (object source, EventArgs args) =gt; FileOperation(source as Window, true, false); yield return importMenuItem; }
Обработчик PopulatePopup определенно вызывается; Я могу просмотреть его в отладчике и увидеть, что в конце всплывающее меню включает элементы, которые я пытаюсь добавить. Также несомненно, что обработчик и оказывает некоторый эффект, потому что обработчик теста, который я добавил в первый пункт меню, вызывается, когда я выбираю опцию Вырезать в меню правой кнопки мыши. Но хотя поведение, которое я добавляю в существующий пункт меню, работает, новые пункты меню, которые я добавляю, никогда не отображаются.
Есть ли дополнительный шаг, который я должен сделать, чтобы элементы, которые я добавляю в коллекцию меню, отображались в меню? Я реализовал вложенные меню в строке меню для одного и того же приложения, и мне никогда не приходилось ничего делать, кроме добавления элементов в родительскую коллекцию.
Если это имеет значение, я использую Gtk# для создания кроссплатформенного приложения для Windows/Linux, и я наблюдаю такое поведение на обеих платформах.
Ответ №1:
В PopulatePopup вы должны установить видимый флаг элементов, которые вы добавляете в «true», чтобы они отображались должным образом.
Этот обработчик работает так, как ожидалось:
_textBox.PopulatePopup = (object source, PopulatePopupArgs args) =gt; { if (args.Popup is Menu menu) { foreach (var item in GetPopupMenuItems()) { item.Visible = true; menu.Add(item); } } };