2017-04-13 31 views
0

由于ImageMenuItem在GTK3中已弃用,因此我正在寻找替换品。我试图采取一个简单的MenuItem,并将ImageAccelLabel包装进去。 (请参阅下面的示例。)虽然这在整体上仍然有效,但仍存在两个问题:替换为ImageMenuItem

  1. 加速键不显示在菜单项中。
  2. 这个图标还有很大的余量。

在下面的例子中,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(); 
    } 
} 

回答

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

菜单项左侧的空间被分配给检查bo XES,可与被禁用:

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. 
*/ 
+0

好吧,'fileSubmenu.ReserveToggleSize = false;'正在工作。但加速器(这将是'fileNewLabel.Xalign = 0.0f;')不显示... –

+0

对不起,我错过了你添加到hboy的项目不同,修复它。 – Kyto

+0

嗯...不起作用。恐怕我不明白箱子的包装与加速器钥匙的可视性有什么关系。 –