天天看點

C#WinForm應用程式中TreeView控件失去焦點後,仍然高亮顯示被選中的節點

方法一:

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、失去焦點時設定選中節點的顔色資訊

//失去焦點時
        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;
            }
        }