2017-04-13 17 views
0

ImageMenuItem은 GTK3에서 사용되지 않으므로 대체품을 찾고 있습니다. 나는 대신 MenuItem을 간단히 사용하려고 시도했으며 ImageAccelLabel을 그 안에 넣었다. (아래 예 참조). 전체적으로 작동하지만 여전히 두 가지 문제가 있습니다.ImageMenuItem 대체품

  1. 가속기 키가 메뉴 항목에 표시되지 않습니다.
  2. 아이콘에 큰 여백이 있습니다. 다음 예에서

File|Open 항목이 File|New 항목이 MenuItem과 같은 결과를 얻을 나의 시도였다 반면되지 않는 ImageMenuItem로 만들었습니다.

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 호출을 사용 :

gtk_label_set_xalign (fileNewLabel, 0.0); 

편집이 : : 또한 PackStart을 두 번 사용하면 전화를해야 가속기 볼 수 있도록하기 위해

(단지 바인딩 C#을로 번역) 그럴 때 :

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

체크 박스에는 왼쪽에 공백이 할당됩니다. XES와 함께 사용할 수 있습니다

되지 않는 GtkImageMenuItem는 사전 예약 토글 크기를 사용하도록에서 해킹을 가지고 있기 때문에 메뉴, 그것의 GtkCheckMenuItem이없는 경우에만 작동하지만
gtk_menu_set_reserve_toggle_size (fileMenu , false); 

. 원래의 해킹과 비슷한 결과를 얻을 수있는 방법을 찾지 못했습니다. gtk 팀에 의해 annotadet이되었습니다 :

/* 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

흠 ... 작동하지 않습니다. 나는 상자의 포장이 액셀러레이터 키의 가시성과 관련이 있는지 이해하지 못한다. –