我正在尝试使用以下代码创建包含名称(作为标签)和关闭按钮(作为带图像的按钮)的新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的建议,但我无法将缓存和鼠标悬停效果添加到该窗口小部件。
答案 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));
你已经完成了。
以下是截图:
答案 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);