由于GTK3中不推荐使用ImageMenuItem
,我正在寻找替代品。我尝试了一个简单的MenuItem
,然后将Image
和AccelLabel
打包到其中。 (参见下面的示例。)虽然这样做总的来说仍有两个问题:
在以下示例中,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 :(得分: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.
*/