Установить цвет текста конкретного элемента (ячейки) в 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 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

Облако Тегов