【问题标题】:Creating a closeable tab in Mono/GTK在 Mono/GTK 中创建可关闭的选项卡
【发布时间】:2020-11-28 16:10:13
【问题描述】:

我正在尝试使用以下代码创建新的 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 的建议,但我无法将浮雕和鼠标悬停效果添加到该小部件。

【问题讨论】:

  • 你为什么不看看一些编写良好的具有此类按钮的 GTK 应用程序的源代码? Gedit 就是一个很好的例子。

标签: mono gtk#


【解决方案1】:

你很幸运。我昨天刚刚做了完全相同的东西,幸运的是可以给你一些代码。诀窍是创建一个自定义标签小部件

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));

你已经完成了。

这是截图:

【讨论】:

    【解决方案2】:

    添加这个:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢您的帮助,但使用 PackStart/PackEnd 似乎没有任何改变;该按钮占用的空间与我使用 Add 时相同。根据我的阅读,我认为问题与 GtkButtons 的默认内边框大小有关。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多