方法一:
1、设置TreeView的DrawMode为.OwnerDrawText
2、绑定DrawNode事件为上面的事件函数
private void init()
{
this.treeView1.HideSelection = false;//失去焦点后不隐藏选中节点
//自已绘制
this.treeView1.DrawMode = TreeViewDrawMode.OwnerDrawText;
this.treeView1.DrawNode += new DrawTreeNodeEventHandler(treeView1_DrawNode);
}
3、定义DrawNode事件函数
如果只是希望失去焦点后仍然有默认的高亮效果,只须设置DrawDefault = true即可:
private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
e.DrawDefault = true; //使用默认颜色,只需要在TreeView失去焦点时选中节点仍然突显
return;
}
如果想自定义高亮颜色,则需进行如下设置:
private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
// 自定义颜色
if (e.State == TreeNodeStates.Selected)
{
//演示为红底白字
e.Graphics.FillRectangle(Brushes.DarkRed, e.Node.Bounds);
Font nodeFont = e.Node.NodeFont;
if (nodeFont == null) nodeFont = ((TreeView)sender).Font;
e.Graphics.DrawString(e.Node.Text, nodeFont, Brushes.White, Rectangle.Inflate(e.Bounds, 2, 0));
}
else
{
e.DrawDefault = true;
}
if (e.State == TreeNodeStates.Focused)
{
using (Pen focusPen = new Pen(Color.Black))
{
focusPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
Rectangle focusBounds = e.Node.Bounds;
focusBounds.Size = new Size(focusBounds.Width - 1,
focusBounds.Height - 1);
e.Graphics.DrawRectangle(focusPen, focusBounds);
}
}
}
方法二:
1、失去焦点时设置选中节点的颜色信息
2、选中新节点之前,恢复当前选中的节点的颜色信息
//失去焦点时
private void treeView1_Leave(object sender, EventArgs e)
{
if(treeView1.SelectedNode!=null)
{
//让选中项背景色呈现红色
treeView1.SelectedNode.BackColor = Color.Red;
//前景色为白色
treeView1.SelectedNode.ForeColor = Color.White;
}
}
//将要选中新节点之前发生
private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
if (treeView1.SelectedNode != null)
{
//将上一个选中的节点背景色还原(原先没有颜色)
treeView1.SelectedNode.BackColor = Color.Empty;
//还原前景色
treeView1.SelectedNode.ForeColor = Color.Black;
}
}