能够创建一个使用构建器加载其内容的新窗口小部件是理想的,例如
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);
哪个确实有效,但是我能够直接加载它仍然有意义。
感谢。
答案 0 :(得分:3)
如果将来有人绊倒这个问题,Vala 0.22具有复合小部件模板,这是解决上述问题的一个更容易的解决方案。复合模板允许您在Glade中定义窗口小部件,并使用属性告诉Vala您的类的哪些位引用窗口小部件的哪些元素,以及连接回调,而无需手动使用Gtk.Builder
。
详情可在http://blogs.gnome.org/tvb/2013/05/29/composite-templates-lands-in-vala/
找到答案 1 :(得分:2)
我们在Geary广泛地这样做。我最常用的技巧是不要在Glade中构建包含对象(即Gtk.Dialog),只是它的内容。然后你可以在Vala中编写对话框/窗口本身。
在Glade 3.15问世之前,这有点痛苦,因为它没有明确支持Box,Grid和其他组件作为顶层。如果你尚未升级,我推荐它。
答案 2 :(得分:1)
不,不可能。 C ++与Gtk.Builder
has this的绑定,但不幸的是它依赖于C ++模板,并没有在任何其他绑定中实现。