我有一个TreeView控件,其中包含多个元素,节点。有没有一种方法可以根据某些条件更改所选项目的前景色或背景色(默认情况下,将带有白色前景色的蓝色背景应用于所选元素)。就我而言,我将检索一个对象并检查其“ NeedSync”属性。如果值为true,则希望该元素具有绿色背景。如果为假,我希望背景为红色。
我查看了其他类似的线程,但要求使用树视图的_DrawItem方法更改未选择的元素的颜色。在WPF中,应该可以通过更改控件样式和指定触发器来实现。
那么在Windows窗体中呢?
编辑:我只需要更改所选元素的字体颜色或背景色,其他所有内容都应保持不变。有没有一种方法可以获取所选节点的默认样式源代码?实现drawNode方法会删除可折叠图标,边距和其他一些东西。
如评论中所述,您将需要将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"
以示例为例。)
注意:如果树视图失去焦点,您可能需要添加其他(但类似的)逻辑来淡化颜色。