2010-04-06 58 views
2

我試圖用以下代碼創建包含名稱(作爲標籤)和關閉按鈕(作爲帶圖像的按鈕)的新GTK Notebook選項卡:在Mono/GTK中創建可關閉的選項卡

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的建議,但我無法將該Relief和鼠標懸停效果添加到該Widget。

+0

你爲什麼不看有這幾樣按鈕的一些精心編寫GTK應用程序的源代碼? Gedit就是一個很好的例子。 – ptomato 2011-01-06 17:11:30

回答

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

0

使用Gtk.Box.PackStart/PackEnd方法而不是通用的Gtk.Container.Add方法將項添加到框。 PackStart/PackEnd將允許您控制子控件將如何分配空間:

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

感謝您的幫助,但使用PackStart/PackEnd似乎沒有任何改變;該按鈕佔用與我使用Add時相同的空間量。從我讀過的內容來看,我認爲問題與GtkButton的默認內部邊界大小有關。 – NWeir 2010-04-12 17:20:45

1

補充一點:

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