2017-04-13 60 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

嗯...不起作用。恐怕我不明白箱子的包裝與加速器鑰匙的可視性有什麼關係。 –