2016-05-16 61 views
0

所以我用C#/ GTKSharp創建了一個treeview選擇器。我有基本的樹視圖選擇器功能工作:數據加載到我的模型,我可以點擊一個節點摺疊/展開。如何獲取GTKSharp TreeView小部件以顯示擴展器?

我無法解決的部分是如何告訴單元格渲染器顯示摺疊/展開切換按鈕。在示例中,它顯示爲一個三角形,根據節點是打開還是摺疊來指向右側或向下。我只是有一個空白空間,按預期工作,因爲我點擊但沒有顯示任何內容。

一種可能性是,我在白色文本問題上有白色問題,但是我對此表示懷疑,因爲我的標籤顯示正常,我還沒有做任何格式化。

我試着添加ShowExpanders的代碼,但那已經是真的了。

 TreeView = new Gtk.TreeView(); 

     // We add the event handlers (i.e. the control part) to the tree 
     TreeView.RowActivated += SelectorActivated;   //On double click 
     TreeView.Selection.Changed += SelectorSelected; // On select (single click) 
      // Raise a context menu here?? 
      // Connect to the ButtonPressEvent 
      // Raise a popup button 

     // Create columns [View] 
     Gtk.TreeViewColumn TreeViewColumTitle = new Gtk.TreeViewColumn(); 
     TreeViewColumTitle.Title = "Profile"; 
     Gtk.CellRendererText NameCellTitle = new Gtk.CellRendererText(); 

     TreeViewColumTitle.PackStart(NameCellTitle, true); 
     TreeViewColumTitle.SetCellDataFunc(NameCellTitle, new Gtk.TreeCellDataFunc(RenderTitle)); 


     NameCellTitle.Mode = CellRendererMode.Activatable; 

     // Populate the model 
     // Note that we could dispense with this step if we generated an ITreeModel 
     // interface in the Object class. 
     BindModel(Model); 

     // Attach everything to the pane 
     TreeView.Model = GTKModel; 
     TreeView.AppendColumn(TreeViewColumTitle); 
     TreeView.ShowExpanders = true; 
     TreeView.ExpanderColumn.Visible = true; 

...

private void BindModel(Model Model) { 
     GTKModel = new Gtk.TreeStore(typeof(Object)); 
     foreach (Object Object in Model.Selector) { 
      var BindingData = new BindingDataGTK(this, Object); 
      BindingData.Iter = GTKModel.AppendValues(Object); 
      Object.BindingData = BindingData; 
      BindChildren(GTKModel, BindingData); 
      } 
     } 

    private void BindChildren(TreeStore TreeStore, BindingDataGTK ObjectBinding) { 

     foreach (var Child in ObjectBinding.Object) { 
      var BindingData = new BindingDataGTK(this, Child); 
      BindingData.Iter = TreeStore.AppendValues(ObjectBinding.Iter, Child); 
      Child.BindingData = BindingData; 
      BindChildren(TreeStore, BindingData); 
      } 
     } 


    private void RenderTitle(Gtk.TreeViewColumn Column, Gtk.CellRenderer Cell, 
         Gtk.ITreeModel GTKModel, Gtk.TreeIter Iter) { 
     Object Object = (Object)GTKModel.GetValue(Iter, 0); 
     (Cell as Gtk.CellRendererText).Text = Object.Title; 


     Console.WriteLine("Render {0}", Object.Title); 
     } 

回答

0

所以,據我所知,這是相當多的自動功能,我覺得沒有什麼特別需要做到這一點(我當然從來沒有需要至)。您可能想嘗試使用TreeIter來構建您的樹嗎?

E.g.假設你已經有一個TreeView窗體上以0(零)列叫「樹視圖」和「MyObject來」叫做「myListOfObjects」列表...

treeview.AppendColumn ("Some Title", new CellRendererText(), "text", 0); 
Gtk.TreeStore _ts = new TreeStore (typeof(string)); 
foreach (IMyObject _mo in myListOfObjects) { 
    Gtk.TreeIter _it = _ts.AppendValues (_mo.SomeText); 
    RecurseInto (_ts, _it, _mo); 
} 
treeview.Model = _ts; 

... 

void RescureInto(Gtk.TreeStore ts, Gtk.TreeIter it, IMyObject mo) 
{ 
    foreach (IMyObject _child_mo in mo.Children) { 
     Gtk.TreeIter _it = ts.AppendValues (it, _child_mo.SomeText); 
     RecurseInto (ts, _it, _child_mo); 
    } 
} 

理論上這應該工作的罰款。

相關問題