2016-05-16 12 views
0

Also ich erstelle einen Baumansichtselektor mit C#/GTKSharp. Ich habe die grundlegende Funktionalität für die Baumansichtsauswahl: Die Daten werden in mein Modell geladen, und ich kann auf einen Knoten klicken, um ihn zu reduzieren/erweitern.Wie bekomme ich das GTKsharp TreeView-Widget zur Anzeige von Expandern?

Der Teil, den ich nicht ausarbeiten kann, ist, wie man den CellRenderer anweist, die Ein/Ausblenden-Schaltfläche anzuzeigen. In den Beispielen wird ein Dreieck angezeigt, das nach rechts oder unten zeigt, je nachdem, ob der Knoten geöffnet oder ausgeblendet ist. Ich habe nur einen leeren Bereich, der wie erwartet funktioniert, während ich klicke, aber nichts zeigt.

Eine Möglichkeit ist, dass ich ein weiß auf weiß Text Problem habe, aber ich bezweifle es, da meine Etiketten gut angezeigt werden und ich noch keine Formatierung getan habe.

Ich habe versucht, Code für ShowExpanders hinzuzufügen, aber das war schon wahr.

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

Antwort

0

So weit ich weiß, das ist so ziemlich eine automatische Funktion ist, ich glaube nicht, etwas Besonderes nötig ist, um sie geschehen (ich habe sicher nie gebraucht zu). Vielleicht möchten Sie einen TreeIter verwenden, um Ihren Baum zu erstellen?

z. vorausgesetzt, Sie bereits ein TreeView auf dem Formular mit 0 (Null) Spalten in it „Treeview“ und eine Liste der „MyObject“ s genannt „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); 
    } 
} 

In der Theorie genannt sollten diese gut funktionieren.