在Mono / GTK中创建一个可关闭的选项卡

时间:2010-04-06 00:10:06

标签: mono gtk#

我正在尝试使用以下代码创建包含名称(作为标签)和关闭按钮(作为带图像的按钮)的新GTK Notebook选项卡:

Label headerLabel = new Label();
headerLabel.Text = "Header";
HBox headerBox = new HBox();
Button closeBtn = new Button();
Image closeImg = new Image(Stock.Close, IconSize.Menu);

closeBtn.Image = closeImg;
closeBtn.Relief = ReliefStyle.None;

headerBox.Add(headerLabel);
headerBox.Add(closeBtn);
headerBox.ShowAll();

MyNotebook.AppendPage(childWidget, headerBox);

这似乎工作得很好;但是,按钮大约需要1.5到2倍,因此按钮内的图像周围有很多额外的空间。看了remove inner border on gtk.Button我现在看到罪魁祸首是GtkButton的“内部边界”风格属性,但(对GTK来说是新手)我似乎无法弄清楚如何覆盖它的价值。

我有什么方法可以做到这一点吗?我对没有使用按钮/图像组合没有任何保留,所以欢迎任何更明显的建议。

注意:我在链接问题中看到了使用EventBox的建议,但我无法将缓存和鼠标悬停效果添加到该窗口小部件。

3 个答案:

答案 0 :(得分:2)

你很幸运。我昨天刚刚做了完全相同的事情,幸运的是可以给你一些代码。诀窍是创建一个自定义选项卡小部件。这是我的代码,但请在使用之前稍微更改一下,因为我的软件是合适的。

 //MultiTab Widget  Copyright (C) Muhammad Ahmad Tirmazi

public class MultiTab : Gtk.Box
{
    public Gtk.Label Caption;
    Gtk.Image img = new Gtk.Image(Platform.IMG + "tab_close.ico");
    public Gtk.ToolButton Close;
    public Gtk.Notebook _parent;

    public MultiTab ( string name )
    {
        CreateUI(name);
    }

    public MultiTab(string name, Gtk.Notebook parent)
    {
        _parent = parent;
        CreateUI(name);
        CreateHandlers();
    }

    void CreateUI(string name)
    {
        Caption = new Gtk.Label(name);
        Close = new Gtk.ToolButton(img,"");
        PackStart( Caption );
        PackStart( Close );
        ShowAll();
        Close.Hide();
    }

    void CreateHandlers()
    {
        Close.Clicked +=  delegate {
            _parent.RemovePage(_parent.CurrentPage);
        };
    }

    public bool Active;

}    

接下来你需要做的就是在Gtk.Notebook中使用这个小部件(或者你创建的类似小部件),如下所示:

   MyNoteBook.AppendPage(new <YourPage>(), new MultiTab("<your caption>",this));

你已经完成了。

以下是截图:

Program with Close-able Tab

答案 1 :(得分:1)

添加:

RcStyle rcStyle = new RcStyle ();
rcStyle.Xthickness = 0;
rcStyle.Ythickness = 0;
closeBtn.ModifyStyle (rcStyle);

答案 2 :(得分:0)

使用Gtk.Box.PackStart / PackEnd方法而不是通用的Gtk.Container.Add方法将项目添加到框中。 PackStart / PackEnd将允许您控制如何为子窗口小部件分配空间:

headerBox.PackStart (headerLabel, true, true, 0);
headerBox.PackEnd (closeBtn, false, false, 0);