Gtk#NodeView彩色行

时间:2013-01-03 23:01:42

标签: c# monodevelop gtk#

我使用NodeView对象以这种方式向用户输出数据(Gtk#tutorial):

    [Gtk.TreeNode (ListOnly=true)]
    public class MyTreeNode : Gtk.TreeNode {

            string song_title;

            public MyTreeNode (string artist, string song_title)
            {
                    Artist = artist;
                    this.song_title = song_title; 
            }

            [Gtk.TreeNodeValue (Column=0)]
            public string Artist;

            [Gtk.TreeNodeValue (Column=1)]
            public string SongTitle {get { return song_title; } }
    }

Gtk.NodeStore store;
    Gtk.NodeStore Store 
    {
        get {
                if (store == null)
                {
                    store = new Gtk.NodeStore (typeof(MyTreeNode));
                    store.AddNode (new MyTreeNode ("The Beatles", "Yesterday"));
                    store.AddNode (new MyTreeNode ("Peter Gabriel", "In Your Eyes"));
                    store.AddNode (new MyTreeNode ("Rush", "Fly By Night"));
                }
            return store;
            }
    }

protected void OnButton1Clicked (object sender, EventArgs e)
{
    // Create a column with title Artist and bind its renderer to model column 0
    nodeview1.AppendColumn ("Artist", new Gtk.CellRendererText (), "text", 0);

    // Create a column with title 'Song Title' and bind its renderer to model column 1
    nodeview1.AppendColumn ("Song Title", new Gtk.CellRendererText (), "text", 1);
        nodeview1.ShowAll ();

    nodeview1.NodeStore=Store;

}

但是如何为NodeView的某些行着色(例如“The Beatles” - “昨天”)?我尝试通过更改NodeView样式来实现:Backgrounds,BaseColors,Foregrounds等,但它不起作用。

编辑:我刚才意识到,我可以这样改变色谱柱的颜色:

protected void OnButton1Clicked (object sender, EventArgs e)
{
    // Create a column with title Artist and bind its renderer to model column 0
    nodeview1.AppendColumn ("Artist", new Gtk.CellRendererText (), "text", 0);



    // Create a column with title 'Song Title' and bind its renderer to model column 1
    nodeview1.AppendColumn ("Song Title", new Gtk.CellRendererText (), "text", 1);
        nodeview1.ShowAll ();

    nodeview1.NodeStore=Store;
    nodeview1.Columns[0].Cells[0].CellBackgroundGdk=new Gdk.Color(0,255,0);
}

但是如何更改特定单元格的颜色?

1 个答案:

答案 0 :(得分:2)

要基于每行更改渲染属性,您有两种可能性

  1. 定义模型中的属性,然后在创建单元格渲染器时引用它们;或
  2. 编写您自己的TreeCellDataFunc并将其绑定到单元格渲染器,以确保在渲染之前更改其属性。
  3. 选项1更快但限制您使用静态定义的值;当渲染不仅仅依赖于一个变量并且你有一些逻辑时,2更好。 我将向您展示如何操作1并参考Mono documentation获取2。

    如果要更改前景色,只需在模型中添加新列:

    [Gtk.TreeNode (ListOnly=true)]
    public class MyTreeNode : Gtk.TreeNode 
    {
        public MyTreeNode (string artist, string title, string color)
        {
            Artist = artist;
            Title = title; 
            Color = color;
        }
    
        [Gtk.TreeNodeValue (Column=0)]
        public string Artist;
    
        [Gtk.TreeNodeValue (Column=1)]
        public string Title;
    
        [Gtk.TreeNodeValue (Column=2)]
        public string Color;
    }
    

    将有效的Gdk颜色表示(如“red”或“#ff0000”)传递给行构造函数:

    store.AddNode(new MyTreeNode("The Beatles", "Yesterday", "red"));
    store.AddNode(new MyTreeNode("Peter Gabriel", "In Your Eyes", "black"));
    

    然后在构建视图时,只需将模型列(2)绑定到单元格渲染器的“foreground”属性:

    nodeview1.AppendColumn("Artist", new Gtk.CellRendererText(), 
                           "text", 0, "foreground", 2);
    
    nodeview1.AppendColumn("Song Title", new Gtk.CellRendererText(),
                           "text", 1, "foreground", 2);
    

    就是这样。