текстовое представление gtksharp.PopulatePopup работает для добавления обработчиков в существующие пункты меню, но не работает для добавления новых пунктов меню

#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);  }  }  };