在C# 的Winform应用程序中,经常会用到树(TreeView)的操作。但此控件有个小缺点,就是失去焦点后,刚才选择的节点不能像刚选择时那样高亮,让用户看不清到底选择的是哪个节点。虽然网上有好多的关于这个的解决方案和代码,但都不太完美。经过作者的多次调试,终于得到完美的代码。
代码如下:
private void Init()
{
// 失去焦点仍选择节点
this.treeView1.HideSelection = false;
// 设置节点的绘制方式(必须选择TreeViewDrawMode.OwnerDrawAll)
this.treeView1.DrawMode = TreeViewDrawMode.OwnerDrawAll;
// 绘制事件
this.treeView1.DrawNode += TreeView1_DrawNode;
}
private void TreeView1_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
if (e.State == TreeNodeStates.Selected)//状态判定
{
// 背景色(原本的背景色,蓝色)
Color bgColor = Color.FromArgb(0, 120, 215);
Brush brush = new SolidBrush(bgColor);
e.Graphics.FillRectangle(brush, new Rectangle(e.Node.Bounds.Left, e.Node.Bounds.Top, e.Node.Bounds.Width, e.Node.Bounds.Height));//背景色为蓝色
// 绘制文本为蓝底白字
TextRenderer.DrawText(e.Graphics,
e.Node.Text,
e.Node.TreeView.Font,
new Rectangle(e.Node.Bounds.Left + 1, e.Node.Bounds.Top, e.Node.Bounds.Width, e.Node.Bounds.Height),
Color.White);
}
else
{
e.DrawDefault = true;
}
}
然后,在窗体的构造函数中调用 Init()方法。
public FormMain()
{
InitializeComponent();
this.Init();
}
运行的效果图