2013-03-05 76 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/