ImageMenuItem的替换

时间:2017-04-13 20:34:37

标签: c# gtk3 gtk#

由于GTK3中不推荐使用ImageMenuItem,我正在寻找替代品。我尝试了一个简单的MenuItem,然后将ImageAccelLabel打包到其中。 (参见下面的示例。)虽然这样做总的来说仍有两个问题:

  1. 加速键不会显示在菜单项中。
  2. 这个图标还有很大的余地。
  3. 在以下示例中,File|Open项目是使用已弃用的ImageMenuItem创建的,而File|New项目是我尝试使用MenuItem获得相同的结果。

    我想让MenuItem看起来像ImageMenuItem,我错过了什么?

    class Program {
    
        public static void Main ()
        {
            Gtk.Application.Init();
    
            var win = new Gtk.Window("test");
            var mb = new Gtk.MenuBar();
    
            var accels = new Gtk.AccelGroup();
            win.AddAccelGroup(accels);
    
            var fileMenu = new Gtk.MenuItem("File");
            mb.Add(fileMenu);
            var fileSubmenu = new Gtk.Menu();
            fileMenu.Submenu = fileSubmenu;
    
            //
            // File | New
            //
            var fileNew = new Gtk.MenuItem();
            fileSubmenu.Add(fileNew);
            fileNew.AddAccelerator(
                "activate", accels,
                new Gtk.AccelKey(Gdk.Key.n, Gdk.ModifierType.ControlMask, Gtk.AccelFlags.Visible));
            fileNew.Activated += (s,e) => System.Console.WriteLine("New ...");
    
            var fileNewIcon = new Gtk.Image();
            fileNewIcon.SetFromIconName("document-new", Gtk.IconSize.Menu);
            var fileNewLabel = new Gtk.AccelLabel("New");
            fileNewLabel.AccelWidget = fileNew;
            var hbox = new Gtk.HBox(false, 4);
            hbox.PackStart(fileNewIcon, false, false, 0);
            hbox.PackStart(fileNewLabel, false, false, 0);
            fileNew.Add(hbox);
    
            //
            // File | Open
            //
            var fileOpen = new Gtk.ImageMenuItem("Open", accels);
            var fileOpenIcon = new Gtk.Image();
            fileOpenIcon.SetFromIconName("document-open", Gtk.IconSize.Menu);
            fileOpen.Image = fileOpenIcon;
            fileOpen.AddAccelerator(
                "activate", accels,
                new Gtk.AccelKey(Gdk.Key.o, Gdk.ModifierType.ControlMask, Gtk.AccelFlags.Visible));
            fileOpen.Activated += (s,e) => System.Console.WriteLine("Open ...");
            fileSubmenu.Add(fileOpen);
    
            win.Add(mb);
            win.ShowAll();
            win.DeleteEvent += (s,e) => Gtk.Application.Quit();
    
            Gtk.Application.Run();
        }
    }
    

1 个答案:

答案 0 :(得分:0)

使用原始gtk调用:(只需转换为c#绑定)

为了使加速器可见,您必须致电:

gtk_label_set_xalign (fileNewLabel, 0.0);

编辑:你应该使用PackStart两次:

gtk_container_add(hbox, fileNewIcon);
gtk_box_pack_end(hbox, fileNewLabel, true, true, 0);

菜单项左侧的空格分配给复选框,可以通过以下方式禁用:

gtk_menu_set_reserve_toggle_size (fileMenu , false);

但是,只有当您的菜单中没有GtkCheckMenuItem时才会有效,因为不推荐使用的GtkImageMenuItem在其中使用预先保留的切换大小。我无法找到一种方法来获得与原始黑客类似的结果,顺便说一句。是由gtk团队注意到的:

/* Man this is lame hardcoding action, but I can't
 * come up with a solution that's really better.
 */