5

能够创建一个使用 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 =是一个无效的分配,但我想知道是否有一种方法可以使用从构建器加载的内容来设置小部件的内容。

与此同时,我已经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);

这确实有效,但对我来说能够直接加载仍然有意义。

谢谢。

4

3 回答 3

3

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

详细信息可以在http://blogs.gnome.org/tvb/2013/05/29/composite-templates-lands-in-vala/找到

于 2013-10-16T10:13:26.507 回答
2

我们在 Geary 中广泛执行此操作。我使用最多的技巧根本不是在 Glade 中构建包含对象(即 Gtk.Dialog),而只是构建它的内容。然后你可以在 Vala 中编写对话框/窗口本身。

在 Glade 3.15 出现之前,这样做有点痛苦,因为它没有明确支持 Box、Grid 和其他组件作为顶层。如果你还没有升级,我推荐它。

于 2013-03-08T01:15:40.937 回答
1

不,不可能。C++ 绑定Gtk.Builder 具有 this,但不幸的是它依赖于 C++ 模板并且尚未在任何其他绑定中实现。

于 2013-03-05T22:03:27.490 回答