树视图控件中所选元素的条件着色

时间:2016-05-17 14:10:07

标签: c# winforms

我有一个TreeView控件,它包含多个元素,节点。有没有办法根据某些条件更改所选项目的前景色背景色(默认为蓝色背景,白色前景应用于所选元素)。在我的情况下,我将检索一个对象并检查它的“NeedSync”#39;属性。如果它的值是真的,我想要元素 例如,有绿色背景。如果它是假的,我希望背景是红色的。

我查看了其他类似的线程,但是要求使用treeview的_DrawItem方法更改未选择元素的颜色。在WPF中,应该可以通过更改控件样式和指定触发器来实现。

这里怎么样,在windows窗体中?

编辑:我只需更改所选元素的字体颜色或背景颜色,其他所有内容应保持不变。有没有办法获取所选节点的默认样式源代码?实现drawNode方法会删除可折叠图标,边距和其他一些内容。

1 个答案:

答案 0 :(得分:5)

正如评论中所述,您需要将DrawMode属性更改为OwnerDrawText,然后在DrawNode事件中添加类似内容:

private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) 
{
   Brush foreColour;
   Brush backColour;
   if (e.Node.IsSelected) 
   {
      if (e.Node.Text == "Node1") 
      {
          // Special highlight colouring 
          foreColour = Brushes.Yellow;
          backColour = Brushes.Red;
      }
      else 
      {
          // Default highlight colouring 
          foreColour = SystemBrushes.HighlightText;
          backColour = SystemBrushes.Highlight;
      }
   }
   else {
      if (e.Node.Text == "Node1") 
      {
         // Special colouring 
         foreColour = Brushes.Red;
         backColour = Brushes.Yellow;
      }
      else 
      {
         // Default colouring 
         foreColour = SystemBrushes.WindowText;
         backColour = SystemBrushes.Window;
      }
   }
   e.Graphics.FillRectangle(backColour, e.Bounds);
   e.Graphics.DrawString(e.Node.Text, treeView1.Font, foreColour, e.Bounds);
}  

(我不知道你想要使用什么标准,所以我添加了e.Node.Text == "Node1"作为例子。)

注意:如果树视图失去焦点,您可能需要添加其他(但类似的)逻辑来淡化颜色。