”становить цвет текста конкретного элемента (€чейки) в TreeView GTK# Mono .NET

19:03:2013 –≥.

¬ заметке рассматриваетс€ способ установки цвета конкретной записи (€чейки, элемента, ноды или другие названи€) в элементе управлени€ TreeView в GTK# Mono .NET

’оть и, с первой точки зрени€, эта задача может казатьс€ простой, но сделать ее может быть не настолько просто, если не понимать логики работы самого элемента управлени€ (к примеру, когда программист раньше писал на C# Windows Forms).

ƒл€ примера будем рассматривать приложение, которое хранит мануалы (документы или маны) по определенным направлени€м в администрировании или программировании.

Tree View в нашем приложении служит дл€ нагл€дного отображени€ документов в иерархической структуре.   примеру, документ по Windows - Windows Server - 2008 R2 - ”становка. »з этой св€зки Windows, Windows Server и 2008 R2 можно считать, условно, папками, а ”становка - документом, где, собственно и рассказываетс€ об установке данной серверно операционной системе.

ƒл€ нагл€дности сразу покажем конечный результат:

TreeView в Grk#

¬ конечном результате требуетс€, чтобы все документы были отмечены красным цветом дл€ нагл€дности. ¬ то же врем€ папки должны отображатьс€ черным, обычым цветом.

  сожалению, простого способа применить к конкретному добавл€емому элементу дерева TreeView GTK# Mono .NET не дает. ј именно к такой схеме работы большинство привыкло при работе на Windows Forms.

¬ GTK# все элементы TreeView подчинаютс€ одному шаблону, поэтому нужно закладывать логику прорисовки именно в шаблон, который примен€етс€ дл€ всех отображаемых элементов дерева, а не пробовать применить его к каждому элементу Tree View в отдельности.

Ќиже представл€ем код объ€влени€ переменных и инициализации данного дерева (переменные €вл€ютс€ глобальными).

Gtk.TreeViewColumn manualColumn;
Gtk.CellRendererText manualNameCell;
Gtk.TreeStore manualTree;


Ќиже идет инициализаци€ окна приложени€:

public MainUI ()
      :base(Gtk.WindowType.Toplevel)
{
     this.Build ();
     InitializeTreeView();
}


» непосредственно сам код инициализации. ѕо€снени€ к коду будут даны ниже.

private void InitializeTreeView()
{
     manualColumn = new Gtk.TreeViewColumn ();
     manualColumn.Title = "“ематика";
     manualNameCell = new Gtk.CellRendererText();
     manualColumn.PackStart (manualNameCell, true);
     manualColumn.AddAttribute (manualNameCell, "text", 0);
     manualTree = new Gtk.TreeStore (typeof (string), typeof(object));

     TV_ManualStructure.AppendColumn (manualColumn);
     TV_ManualStructure.Model = manualTree;
    
     manualColumn.SetCellDataFunc (manualNameCell, delegate (TreeViewColumn col, CellRenderer cell, TreeModel model, TreeIter iter)
       { var textCell = (CellRendererText) cell;
         DocumentInstance docInstance = model.GetValue (iter, 1) as DocumentInstance;

         if(docInstance != null)
           textCell.Foreground = "red";
         else
           textCell.Foreground = "black";
       });
   
    ShowAll ();
}

—писок выше состиоит из друх колонок. ѕерва€ колонка - строка, втора€ типа object. —ам объект TreeView, который был добавлен в IDE Monodevelop на форму имеет название TV_ManualStructure.  ак видно, отображаетс€ дл€ пользовател€ только текстова€ колонка.  олонка же, котора€ содержит объект, скрыта от пользовател€ и в ней хран€тс€ реальные данные, которые используют€ нашим GTK-Sharp приложением.

»спользу€ инкапсул€цию, в каждый объект TreeView добавл€етс€ свой соответствующий по значению объект. ƒл€ этого предусмотрено два класса - DocumentInstance и NodeInstance. ѕервый €вл€ет собой объектное представлени€ документа. ¬торой - объектное представление "папки", или родительского элемента, который просто служит дл€ визуализации вложенности. “ак, на нашем примере в начале данной заметки Windows - Windows Server - 2008 R2 были бы экземпл€рами класса NodeInstance, а "”становка" - DocumentInstance.

ƒл€ нашей колонки мы задаем фунецию, в которой мы можем вли€ть на шаблон дл€ данной колонки. ћы провер€ем, €вл€етс€ ли конкретный элемент экземпл€ром DocumentInstance. ≈сли €вл€етс€ - задаем ему значение Foreground дл€ TreeView в красный, а если нет - в черный.

“аким образом, мы достигли эффекта, к которому шли. “еперь можно добавл€ть в наше дерево ноды и документы, но дл€ всех документов будет работать выделение красным цветом.

 

ƒобавить комментарий


«ащитный код
ќбновить

« Window ShowDialog() в Mono GTK# или модальное окно, блокирующее выполнение кода при вызове ѕолучить выбранный элемент TreeView в Mono GTK# .NET »

‘отоальбом

fotic.jpg

ќблако “егов