Создание закрываемой вкладки в Mono / GTK - PullRequest
2 голосов
/ 06 апреля 2010

Я пытаюсь создать новые вкладки 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 раза больше требуемого размера, поэтому вокруг кнопки внутри изображения много свободного пространства. Посмотрев на удалить внутреннюю границу на gtk.Button , я теперь вижу, что виновником является свойство стиля "inner-border" в GtkButton, но (будучи новичком в GTK) я не могу понять как переопределить его значение.

Есть ли какой-то способ сделать это, что я пропускаю? У меня нет никаких сомнений в том, что я не использую комбинацию «кнопка / изображение», поэтому любые более очевидные предложения приветствуются.

Примечание: я видел предложение в связанном вопросе использовать EventBox, но я не смог добавить эффекты Relief и mouseover к этому виджету.

Ответы [ 3 ]

2 голосов
/ 30 сентября 2011

Вам повезло. Я только что сделал точно такую ​​же вещь вчера, и, к счастью, могу дать вам некоторый код. Хитрость в том, чтобы создать Custom Tab Widget . Вот код для моего, но, пожалуйста, немного измените его перед использованием, потому что мое программное обеспечение является правильным.

 //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 голос
/ 04 января 2011

Добавить это:

RcStyle rcStyle = new RcStyle ();
rcStyle.Xthickness = 0;
rcStyle.Ythickness = 0;
closeBtn.ModifyStyle (rcStyle);
0 голосов
/ 11 апреля 2010

Добавьте элементы в коробку, используя методы Gtk.Box.PackStart / PackEnd, а не универсальный метод Gtk.Container.Add. PackStart / PackEnd позволит вам контролировать, как дочерним виджетам будет выделяться пространство:

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