Treeview控件中选定元素的条件着色

The*_*Kid 3 c# winforms

我有一个TreeView控件,其中包含多个元素,节点。有没有一种方法可以根据某些条件更改所选项目的前景色背景色(默认情况下,将带有白色前景色的蓝色背景应用于所选元素)。就我而言,我将检索一个对象并检查其“ NeedSync”属性。如果值为true,则希望该元素具有绿色背景。如果为假,我希望背景为红色。

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

那么在Windows窗体中呢?

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

Ulr*_*ric 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);
}  
Run Code Online (Sandbox Code Playgroud)

(我不知道您要使用什么标准,因此我e.Node.Text == "Node1"以示例为例。)

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