【问题标题】:Conditional coloring of the selected element in a treeview control树视图控件中选定元素的条件着色
【发布时间】:2016-05-17 14:10:07
【问题描述】:

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

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

在 Windows 窗体中呢?

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

【问题讨论】:

  • 是的,你必须使用 DrawNode 方法。将 DrawMode 属性设置为 OwnerDrawText。
  • 是的,您需要对DrawNode 事件进行编码。在那里你可以检查e.State.HasFlag(TreeNodeStates.Selected)

标签: c# winforms


【解决方案1】:

正如 cmets 中所说,您需要将 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"作为示例。)

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

【讨论】:

    猜你喜欢
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多