方法一:
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; } }