2013-01-03 15 views
5

tôi sử dụng đối tượng NodeView số liệu đầu ra cho người sử dụng theo cách này (Gtk # hướng dẫn):Gtk # NodeView hàng màu

[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; 

} 

Nhưng làm thế nào tôi có thể tô màu cho một số hàng của NodeView ("The Beatles" - "Hôm qua ", ví dụ)? Tôi đã cố gắng để làm điều đó bằng cách thay đổi của NodeView Style: Backgrounds, BaseColors, Foregrounds và khác nhưng nó không hoạt động.

Chỉnh sửa: Tôi chỉ nhận ra, rằng tôi có thể thay đổi màu của cột theo cách này:

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

nhưng làm thế nào tôi có thể thay đổi màu sắc của một tế bào cụ thể?

+0

Tôi không thể thử ngay bây giờ, do đó cũng giống như nhận xét: Bạn có thể xem xét thay thế trình kết xuất ô bằng một thứ gì đó tùy chỉnh lấp đầy ô bằng một tiện ích có màu thích hợp. –

+0

Tôi không thể tìm thấy bất cứ điều gì như nó. Nodeview không có một số sự kiện cho ô – Mixim

+0

Nó không phải là một sự kiện. Bạn hiện đang sử dụng lớp 'Gtk.CellRendererText', nhưng thay vào đó, bạn có thể lấy được lớp trình kết xuất ô của riêng bạn từ [' Gtk.CellRenderer'] (http://docs.go-mono.com/?link= T% 3aGtk.CellRenderer) bằng cách ghi đè phương thức 'GetSize' và' Render' của nó. –

Trả lời

2

Để thay đổi thuộc tính render trên cơ sở cho mỗi hàng bạn có hai khả năng

  1. xác định các thuộc tính trong mô hình của bạn và sau đó tham chiếu chúng khi bạn tạo ra kết xuất đồ họa di động; hoặc
  2. viết TreeCellDataFunc của riêng bạn và liên kết nó với trình kết xuất ô để đảm bảo bạn thay đổi thuộc tính của nó trước khi hiển thị.

Tùy chọn 1 nhanh hơn nhưng giới hạn bạn theo giá trị được xác định tĩnh; 2 là tốt hơn khi rendering phụ thuộc vào nhiều hơn chỉ là một biến và bạn có một số logic tham gia. tôi sẽ chỉ cho bạn cách làm 1 và tham khảo Mono documentation cho 2.

Nếu bạn muốn thay đổi màu nền trước, bạn chỉ cần thêm một cột mới vào mô hình của bạn:

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

đi qua một đại diện màu GDK hợp lệ, như "đỏ" hoặc "# ff0000" để các nhà xây dựng hàng:

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

Sau đó, khi bạn xây dựng quan điểm của bạn, bạn chỉ cần để ràng buộc rằng mô hình cột (2) đến "tiền cảnh" tài sản của trình kết xuất ô:

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

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

Đó là tất cả.