gtksharp TextView.PopulatePopup 可以将处理程序添加到现有菜单项,但不能添加新菜单项

gtksharp TextView.PopulatePopup works to add handlers to existing menu items, but doesn't work to add new menu items

我正在尝试将项目添加到 GtkSharp(版本 3.22.25.128)中 TextView 的上下文菜单。上下文菜单通常包含条目 Cut/Copy/Paste/Delete/Separator/Select All/Insert 表情符号。我正在尝试向菜单添加更多条目,从分隔符开始。

为此,我向 PopulateMenu 事件添加了一个处理程序,如下所示:

            _textBox.PopulatePopup += (object source, PopulatePopupArgs args) => {
            if (args.Popup is Menu menu)
            {
                (menu.Children[0] as MenuItem).Activated += 
                    (object src, EventArgs a) => {
                        Setting.SetRaw("This happened");
                    };
                foreach (var item in GetPopupMenuItems())
                {
                    menu.Add(item);
                }
            }
        };

GetPopupMenuItems() 的缩写版本是:

    IEnumerable<MenuItem> GetPopupMenuItems()
    {
        yield return new SeparatorMenuItem();

        var importMenuItem = new MenuItem("Import single value from text file");
        importMenuItem.Activated += (object source, EventArgs args) => FileOperation(source as Window, true, false);
        yield return importMenuItem;
    }

肯定正在调用 PopulatePopup 处理程序;我可以在调试器中单步执行它,并在最后看到弹出菜单包含我要添加的项目。也可以肯定处理程序有 一些 效果,因为当我 select 右键菜单中的剪切选项时,我添加到第一个菜单项的测试处理程序被调用.但是,尽管我添加到 现有 菜单项的行为有效,但我添加的新菜单项从未显示。

我是否需要执行额外的步骤才能让我添加到菜单集合中的项目显示在菜单中?我已经在同一个应用程序的菜单栏中实现了嵌套菜单,除了将项目添加到父级的集合之外,我什么都不用做。

如果它有所作为,我正在使用 Gtk# 制作一个跨平台的 Windows/Linux 应用程序,并且我在两个平台上都观察到这种行为。

在 PopulatePopup 中,您必须将要添加的项目的 Visible 标志设置为“true”才能使它们按预期显示。

此处理程序按预期工作:

            _textBox.PopulatePopup += (object source, PopulatePopupArgs args) => {
            if (args.Popup is Menu menu)
            {
                foreach (var item in GetPopupMenuItems())
                {
                    item.Visible = true;
                    menu.Add(item);
                }
            }
        };