ZetCode

GTK# 中的工具栏

最后修改于 2023 年 10 月 18 日

在本 GTK# 编程教程中,我们将学习工具栏。

菜单组织了我们可以在应用程序中使用的命令。工具栏提供对最常用命令的快速访问。工具栏是一个带有按钮的水平或垂直面板。这些按钮有图像或图像和文本。通过单击工具栏按钮,我们可以执行一个操作。

简单工具栏

接下来,我们创建一个简单的工具栏。

toolbar.cs
using Gtk;
using System;
 
class SharpApp : Window {
 

    public SharpApp() : base("Toolbar")
    {
        SetDefaultSize(250, 200);
        SetPosition(WindowPosition.Center);
        DeleteEvent += delegate { Application.Quit(); };
        
        Toolbar toolbar = new Toolbar();
        toolbar.ToolbarStyle = ToolbarStyle.Icons;

        ToolButton newtb = new ToolButton(Stock.New);
        ToolButton opentb = new ToolButton(Stock.Open);
        ToolButton savetb = new ToolButton(Stock.Save);
        SeparatorToolItem sep = new SeparatorToolItem();
        ToolButton quittb = new ToolButton(Stock.Quit);

        toolbar.Insert(newtb, 0);
        toolbar.Insert(opentb, 1);
        toolbar.Insert(savetb, 2);
        toolbar.Insert(sep, 3);
        toolbar.Insert(quittb, 4);

        quittb.Clicked += OnClicked;
         
        VBox vbox = new VBox(false, 2);
        vbox.PackStart(toolbar, false, false, 0);
        
        Add(vbox);

        ShowAll();
    }

    void OnClicked(object sender, EventArgs args)
    {
        Application.Quit();
    }

    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

该示例显示了一个工具栏和四个工具按钮。

Toolbar toolbar = new Toolbar();

创建了一个 Toolbar 控件。

toolbar.ToolbarStyle = ToolbarStyle.Icons;

在工具栏上,我们只显示图标。没有文本。

ToolButton newtb = new ToolButton(Stock.New);

创建一个带有来自 stock 的图像的 ToolButton

SeparatorToolItem sep = new SeparatorToolItem(); 

这是一个分隔符。它可用于将工具栏按钮分组到逻辑组中。

toolbar.Insert(newtb, 0);
toolbar.Insert(opentb, 1);
...

工具栏按钮被插入到工具栏控件中。

Toolbar
图:工具栏

工具栏

在第二个示例中,我们展示了两个工具栏。许多应用程序都有多个工具栏。我们展示了如何在 GTK# 中实现它。

toolbars.cs
using Gtk;
using System;
 
class SharpApp : Window {
 

    public SharpApp() : base("Toolbars")
    {
        SetDefaultSize(250, 200);
        SetPosition(WindowPosition.Center);
        DeleteEvent += delegate { Application.Quit(); };
        
        Toolbar upper = new Toolbar();
        upper.ToolbarStyle = ToolbarStyle.Icons;

        ToolButton newtb = new ToolButton(Stock.New);
        ToolButton opentb = new ToolButton(Stock.Open);
        ToolButton savetb = new ToolButton(Stock.Save);

        upper.Insert(newtb, 0);
        upper.Insert(opentb, 1);
        upper.Insert(savetb, 2);

        Toolbar lower = new Toolbar();
        lower.ToolbarStyle = ToolbarStyle.Icons;

        ToolButton quittb = new ToolButton(Stock.Quit);
        quittb.Clicked += OnClicked;
        lower.Insert(quittb, 0);

         
        VBox vbox = new VBox(false, 2);
        vbox.PackStart(upper, false, false, 0);
        vbox.PackStart(lower, false, false, 0);

        Add(vbox);

        ShowAll();
    }

    void OnClicked(object sender, EventArgs args)
    {
        Application.Quit();
    }


    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

我们的应用程序显示了两个工具栏。

Toolbar upper = new Toolbar();
...
Toolbar lower = new Toolbar();

我们创建了两个 Toolbar 控件。

upper.Insert(newtb, 0);
...
lower.Insert(quittb, 0);

它们中的每一个都有自己的工具按钮。

VBox vbox = new VBox(false, 2);
vbox.PackStart(upper, false, false, 0);
vbox.PackStart(lower, false, false, 0)

工具栏一个接一个地被打包到垂直框中。

Toolbars
图:工具栏

撤销重做

以下示例演示了如何在工具栏上禁用工具栏按钮。这在 GUI 编程中很常见。例如,保存按钮。如果我们将文档的所有更改保存到磁盘,则在大多数文本编辑器中,保存按钮将被禁用。通过这种方式,应用程序向用户表明所有更改都已保存。

undoredo.cs
using Gtk;
using System;
 
class SharpApp : Window {
 
    private int count = 2;
    private ToolButton undo;
    private ToolButton redo;

    public SharpApp() : base("Undo redo")
    {
        SetDefaultSize(250, 200);
        SetPosition(WindowPosition.Center);
        DeleteEvent += delegate { Application.Quit(); };
        
        Toolbar toolbar = new Toolbar();
        toolbar.ToolbarStyle = ToolbarStyle.Icons;

        undo = new ToolButton(Stock.Undo);
        redo = new ToolButton(Stock.Redo);
        SeparatorToolItem sep = new SeparatorToolItem();
        ToolButton quit = new ToolButton(Stock.Quit);

        toolbar.Insert(undo, 0);
        toolbar.Insert(redo, 1);
        toolbar.Insert(sep, 2);
        toolbar.Insert(quit, 3);

        undo.Clicked += OnUndo;
        redo.Clicked += OnRedo;
        quit.Clicked += OnClicked;
         
        VBox vbox = new VBox(false, 2);
        vbox.PackStart(toolbar, false, false, 0);
        vbox.PackStart(new Label(), false, false, 0);

        Add(vbox);

        ShowAll();
    }

    void OnUndo(object sender, EventArgs args)
    {
        count -= 1;

        if (count <= 0) {
            undo.Sensitive = false;
            redo.Sensitive = true;
        }
    }

    void OnRedo(object sender, EventArgs args)
    {
        count += 1;

        if (count >= 5) {
            redo.Sensitive = false;
            undo.Sensitive = true;
        }
    }

    void OnClicked(object sender, EventArgs args)
    {
        Application.Quit();
    }

    public static void Main()
    {
        Application.Init();
        new SharpApp();
        Application.Run();
    }
}

我们的示例从 GTK# stock 资源中创建撤销和重做按钮。在几次点击后,每个按钮都会被禁用。按钮变为灰色。

private int count = 2;

count 变量决定哪个按钮被激活和禁用。

undo = new ToolButton(Stock.Undo);
redo = new ToolButton(Stock.Redo);

我们有两个工具按钮。撤销和重做工具按钮。图像来自 stock 资源。

undo.Clicked += OnUndo;
redo.Clicked += OnRedo;

我们为这两个工具按钮的 Clicked 事件插入一个方法。

if (count <= 0) {
    undo.Sensitive = false;
    redo.Sensitive = true;
}

要激活一个控件,我们将它的 Sensitive 属性设置为 true。要禁用它,我们将其设置为 false。

Undo redo
图:撤销重做

在本 GTK# 编程库的这一章中,我们提到了工具栏。