使用生成器内容构造Vala Gtk对象

使用生成器内容构造Vala Gtk对象,gtk,vala,Gtk,Vala,最好能够创建一个使用builder加载其内容的新小部件,例如 public class MyDialog : Dialog { public MyDialog { Gtk.Builder builder = new Gtk.Builder (); builder.add_from_file ("dialog.ui"); this = builder.get_object ("my_dialog") as Gtk.Widget

最好能够创建一个使用builder加载其内容的新小部件,例如

public class MyDialog : Dialog
  {
    public MyDialog
      {
        Gtk.Builder builder = new Gtk.Builder ();
        builder.add_from_file ("dialog.ui");
        this = builder.get_object ("my_dialog") as Gtk.Widget;
      }
    }
显然,这不起作用,因为
this=
是一个无效的赋值,但我想知道是否有一种方法可以使用从builder加载的内容来设置小部件的内容

同时,我将
this=…
替换为

var content = get_content_area ();
var dialog = builder.get_object ("my_dialog") as Gtk.Widget;
var _content = (dialog as Dialog).get_content_area ();
_content.reparent (content);
这确实有效,但对我来说,能够直接加载还是有意义的


谢谢。

不,不可能。C++绑定到代码> GTK.Builder < /C>,但遗憾的是它依赖于C++模板,还没有在任何其他绑定中实现。

< P>我们在Geary做了大量的工作。我使用最多的技巧不是在Glade中构建包含对象(即Gtk.Dialog),而是构建其内容。然后,您可以在Vala中对对话框/窗口本身进行编码


在Glade3.15问世之前,这是一种痛苦,因为它没有明确地支持Box、Grid和其他组件作为顶级。如果您还没有升级,我建议您升级。

如果将来有人遇到这个问题,Vala 0.22将提供复合小部件模板,这是解决上述问题的一个更简单的方法。复合模板允许您在Glade中定义一个小部件,并使用属性告诉Vala类的哪些位引用了小部件的哪些元素,以及连接回调,而无需手动使用
Gtk.Builder


详情可在

Hmm找到,太糟糕了。你认为重新租用内容区的方法有什么问题吗?嗯,这很有趣,因为我多年来都没有尝试过用一个盒子作为顶层,因为它从来都不起作用。非常感谢这就是我从现在开始要做的,并不是说重新教育内容不起作用,只是现在看起来没有必要。