2016-05-17 29 views
3

我有一個TreeView控件,它包含多個元素節點。有沒有辦法改變選定項目的前景色背景色(默認藍色背景,白色前景應用於選定的元素)基於某些條件。就我而言,我將檢索一個對象並檢查其「NeedSync」屬性。如果它的值是真的,我想要 的元素具有,例如,綠色背景。如果它是假的,我想背景是紅色的。在樹視圖控件中對所選元素進行條件着色

我看了其他類似的線程,但需要使用treeview的_DrawItem方法更改未選定元素的顏色。在WPF中,這應該可以通過更改控件樣式和指定觸發器來實現。

這裏在windows窗體中怎麼樣?

編輯:我只需要改變所選元素的字體顏色或背景顏色,其他所有元素都應該保持不變。有沒有辦法獲得選定節點的默認樣式源代碼?實現drawNode方法將刪除可摺疊圖標,邊距等一些其他內容。

+5

是的,你必須使用DrawNode方法。將DrawMode屬性設置爲OwnerDrawText。 – LarsTech

+1

是的,你需要編寫'DrawNode'事件。在那裏你可以檢查'e.State.HasFlag(TreeNodeStates.Selected)' – TaW

回答

4

正如評論說,你需要將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); 
} 

(我不知道你想用什麼樣的標準,因此我添加了e.Node.Text == "Node1"作爲示例。)

注意:如果treeview失去焦點,您可能需要添加其他(但類似)邏輯來淡化顏色。