原文: http://zetcode.com/gui/gtksharp/menus/

在 GTK# 编程教程的这一部分中,我们将使用菜单。

菜单栏是 GUI 应用中最常见的部分之一。 它是位于各个菜单中的一组命令。 在控制台应用中,我们必须记住各种奥术命令,而在这里,我们将大多数命令分组为逻辑部分。 这些公认的标准可进一步减少学习新应用的时间。

简单菜单

在第一个示例中,我们将创建一个带有一个文件菜单的菜单栏。 该菜单将只有一个菜单项。 通过选择项目,应用退出。

simplemenu.cs

  1. using Gtk;
  2. using System;
  3. class SharpApp : Window {
  4. public SharpApp() : base("Simple menu")
  5. {
  6. SetDefaultSize(250, 200);
  7. SetPosition(WindowPosition.Center);
  8. DeleteEvent += delegate { Application.Quit(); };
  9. MenuBar mb = new MenuBar();
  10. Menu filemenu = new Menu();
  11. MenuItem file = new MenuItem("File");
  12. file.Submenu = filemenu;
  13. MenuItem exit = new MenuItem("Exit");
  14. exit.Activated += OnActivated;
  15. filemenu.Append(exit);
  16. mb.Append(file);
  17. VBox vbox = new VBox(false, 2);
  18. vbox.PackStart(mb, false, false, 0);
  19. Add(vbox);
  20. ShowAll();
  21. }
  22. void OnActivated(object sender, EventArgs args)
  23. {
  24. Application.Quit();
  25. }
  26. public static void Main()
  27. {
  28. Application.Init();
  29. new SharpApp();
  30. Application.Run();
  31. }
  32. }

这是一个最小的菜单栏功能示例。

  1. MenuBar mb = new MenuBar();

MenuBar小部件已创建。

  1. Menu filemenu = new Menu();
  2. MenuItem file = new MenuItem("File");
  3. file.Submenu = filemenu;

创建顶层MenuItem

  1. MenuItem exit = new MenuItem("Exit");
  2. exit.Activated += OnActivated;
  3. filemenu.Append(exit);

将创建出口MenuItem,并将其附加到文件MenuItem中。

  1. mb.Append(file);

顶级MenuItem被附加到MenuBar小部件。

  1. VBox vbox = new VBox(false, 2);
  2. vbox.PackStart(mb, false, false, 0);

与其他工具包不同,我们必须自己照顾布局管理。 我们将菜单栏放入垂直框中。

GTK 中的菜单 - 图1

图:简单菜单

图像菜单

在下一个示例中,我们将进一步探索菜单。 我们将图像和加速器添加到我们的菜单项中。 加速器是用于激活菜单项的键盘快捷键。

imagemenu.cs

  1. using Gtk;
  2. using System;
  3. class SharpApp : Window {
  4. public SharpApp() : base("Image menu")
  5. {
  6. SetDefaultSize(250, 200);
  7. SetPosition(WindowPosition.Center);
  8. DeleteEvent += delegate { Application.Quit(); };
  9. MenuBar mb = new MenuBar();
  10. Menu filemenu = new Menu();
  11. MenuItem file = new MenuItem("File");
  12. file.Submenu = filemenu;
  13. AccelGroup agr = new AccelGroup();
  14. AddAccelGroup(agr);
  15. ImageMenuItem newi = new ImageMenuItem(Stock.New, agr);
  16. newi.AddAccelerator("activate", agr, new AccelKey(
  17. Gdk.Key.n, Gdk.ModifierType.ControlMask, AccelFlags.Visible));
  18. filemenu.Append(newi);
  19. ImageMenuItem open = new ImageMenuItem(Stock.Open, agr);
  20. open.AddAccelerator("activate", agr, new AccelKey(
  21. Gdk.Key.n, Gdk.ModifierType.ControlMask, AccelFlags.Visible));
  22. filemenu.Append(open);
  23. SeparatorMenuItem sep = new SeparatorMenuItem();
  24. filemenu.Append(sep);
  25. ImageMenuItem exit = new ImageMenuItem(Stock.Quit, agr);
  26. exit.AddAccelerator("activate", agr, new AccelKey(
  27. Gdk.Key.q, Gdk.ModifierType.ControlMask, AccelFlags.Visible));
  28. exit.Activated += OnActivated;
  29. filemenu.Append(exit);
  30. mb.Append(file);
  31. VBox vbox = new VBox(false, 2);
  32. vbox.PackStart(mb, false, false, 0);
  33. vbox.PackStart(new Label(), false, false, 0);
  34. Add(vbox);
  35. ShowAll();
  36. }
  37. void OnActivated(object sender, EventArgs args)
  38. {
  39. Application.Quit();
  40. }
  41. public static void Main()
  42. {
  43. Application.Init();
  44. new SharpApp();
  45. Application.Run();
  46. }
  47. }

我们的示例显示了具有三个子菜单项的顶级菜单项。 每个菜单项都有一个图像和一个加速器。 退出菜单项的加速器处于活动状态。

  1. AccelGroup agr = new AccelGroup();
  2. AddAccelGroup(agr);

要使用加速器,我们创建一个全局AccelGroup对象。 稍后将使用。

  1. ImageMenuItem newi = new ImageMenuItem(Stock.New, agr);

ImageMenuItem已创建。 图片来自图片库。

  1. exit.AddAccelerator("activate", agr, new AccelKey(
  2. Gdk.Key.q, Gdk.ModifierType.ControlMask, AccelFlags.Visible));

这将为退出菜单项创建 Ctrl + Q 加速器。

  1. SeparatorMenuItem sep = new SeparatorMenuItem();
  2. filemenu.Append(sep);

这些行创建一个分隔符。 它用于将菜单项分组为逻辑组。

GTK 中的菜单 - 图2

图:图像 menu

CheckMenuItem

CheckMenuItem是带有复选框的菜单项。 它可以用于布尔属性。

checkmenuitem.cs

  1. using Gtk;
  2. using System;
  3. class SharpApp : Window {
  4. private Statusbar statusbar;
  5. public SharpApp() : base("Check menu item")
  6. {
  7. SetDefaultSize(250, 200);
  8. SetPosition(WindowPosition.Center);
  9. DeleteEvent += delegate { Application.Quit(); };
  10. MenuBar mb = new MenuBar();
  11. Menu filemenu = new Menu();
  12. MenuItem file = new MenuItem("File");
  13. file.Submenu = filemenu;
  14. Menu viewmenu = new Menu();
  15. MenuItem view = new MenuItem("View");
  16. view.Submenu = viewmenu;
  17. CheckMenuItem stat = new CheckMenuItem("View Statusbar");
  18. stat.Toggle();
  19. stat.Toggled += OnStatusView;
  20. viewmenu.Append(stat);
  21. MenuItem exit = new MenuItem("Exit");
  22. exit.Activated += OnActivated;
  23. filemenu.Append(exit);
  24. mb.Append(file);
  25. mb.Append(view);
  26. statusbar = new Statusbar();
  27. statusbar.Push(1, "Ready");
  28. VBox vbox = new VBox(false, 2);
  29. vbox.PackStart(mb, false, false, 0);
  30. vbox.PackStart(new Label(), true, false, 0);
  31. vbox.PackStart(statusbar, false, false, 0);
  32. Add(vbox);
  33. ShowAll();
  34. }
  35. void OnStatusView(object sender, EventArgs args)
  36. {
  37. CheckMenuItem item = (CheckMenuItem) sender;
  38. if (item.Active) {
  39. statusbar.Show();
  40. } else {
  41. statusbar.Hide();
  42. }
  43. }
  44. void OnActivated(object sender, EventArgs args)
  45. {
  46. Application.Quit();
  47. }
  48. public static void Main()
  49. {
  50. Application.Init();
  51. new SharpApp();
  52. Application.Run();
  53. }
  54. }

在我们的代码示例中,我们显示一个检查菜单项。 如果该复选框已激活,则显示状态栏小部件。 如果不是,状态栏将被隐藏。

  1. CheckMenuItem stat = new CheckMenuItem("View Statusbar");

CheckMenuItem小部件已创建。

  1. stat.Toggle();

Toggle()方法选中/取消选中检查菜单项。

  1. if (item.Active) {
  2. statusbar.Show();
  3. } else {
  4. statusbar.Hide();
  5. }

根据CheckMenuItem的状态,我们显示或隐藏状态栏小部件。

GTK 中的菜单 - 图3

图:CheckMenuItem

子菜单

我们的最后一个示例演示了如何在 GTK# 中创建一个子菜单。

submenu.cs

  1. using Gtk;
  2. using System;
  3. class SharpApp : Window {
  4. public SharpApp() : base("Submenu")
  5. {
  6. SetDefaultSize(250, 200);
  7. SetPosition(WindowPosition.Center);
  8. DeleteEvent += delegate { Application.Quit(); };
  9. MenuBar mb = new MenuBar();
  10. Menu filemenu = new Menu();
  11. MenuItem file = new MenuItem("File");
  12. file.Submenu = filemenu;
  13. // submenu creation
  14. Menu imenu = new Menu();
  15. MenuItem import = new MenuItem("Import");
  16. import.Submenu = imenu;
  17. MenuItem inews = new MenuItem("Import news feed...");
  18. MenuItem ibookmarks = new MenuItem("Import bookmarks...");
  19. MenuItem imail = new MenuItem("Import mail...");
  20. imenu.Append(inews);
  21. imenu.Append(ibookmarks);
  22. imenu.Append(imail);
  23. // exit menu item
  24. MenuItem exit = new MenuItem("Exit");
  25. exit.Activated += OnActivated;
  26. filemenu.Append(import);
  27. filemenu.Append(exit);
  28. mb.Append(file);
  29. VBox vbox = new VBox(false, 2);
  30. vbox.PackStart(mb, false, false, 0);
  31. vbox.PackStart(new Label(), false, false, 0);
  32. Add(vbox);
  33. ShowAll();
  34. }
  35. void OnActivated(object sender, EventArgs args)
  36. {
  37. Application.Quit();
  38. }
  39. public static void Main()
  40. {
  41. Application.Init();
  42. new SharpApp();
  43. Application.Run();
  44. }
  45. }

子菜单创建。

  1. Menu imenu = new Menu();

子菜单是Menu

  1. MenuItem import = new MenuItem("Import");
  2. import.Submenu = imenu;

它是菜单项的子菜单,它会登录到顶级文件菜单。

  1. MenuItem inews = new MenuItem("Import news feed...");
  2. MenuItem ibookmarks = new MenuItem("Import bookmarks...");
  3. MenuItem imail = new MenuItem("Import mail...");
  4. imenu.Append(inews);
  5. imenu.Append(ibookmarks);
  6. imenu.Append(imail);

子菜单有其自己的菜单项。

GTK 中的菜单 - 图4

图:子菜单

在 GTK# 编程库的这一章中,我们展示了如何使用菜单。