2013-03-05 79 views
5

这将是理想的能够创建一个使用构建器加载其内容的新小部件,例如。使用构建器内容构建Vala Gtk对象

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 =是无效的任务,但我不知道是否有一种方法来设置使用那些已经从建设者加载控件的内容。

对于此期间,我曾与

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

这不工作替换this = ...,但它仍然将是有意义的我能够直接加载。

感谢。

回答

1

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

+0

嗯,太糟糕了。你认为重新设置content_area的方法有什么问题吗? – 2013-03-05 23:10:24

+0

对我来说似乎很好。 – ptomato 2013-03-06 09:30:50

2

我们在Geary做了大量工作。我最常用的技巧不是在Glade中构建包含对象(即Gtk.Dialog),而仅仅是构建它的内容。然后你可以在Vala中编写对话框/窗口本身。

在Glade 3.15发布之前,这是一种痛苦,因为它没有明确支持Box,Grid和其他组件作为顶层。如果你还没有升级,我推荐它。

+0

嗯,这很有趣,因为我从来没有试图用Box作为顶级水平多年,因为它从来没有用过。非常感谢我从现在开始做的事情,而不是重新养育内容不起作用,现在看起来没有必要。 – 2013-03-11 19:06:11

3

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

详情可以在http://blogs.gnome.org/tvb/2013/05/29/composite-templates-lands-in-vala/