2010-08-06 82 views
3

在WPF中有定義交替可見行背景的方法嗎?基於可見性定義交替TreeView行的背景顏色

我已經嘗試設置AlternationCount屬性,但重新啓動每個子節點給出一個奇怪的外觀。

理想情況下,我想知道給定節點的視覺索引是什麼。只計算展開的節點。

回答

4

由於WPF爲樹節點創建了嵌套容器,所以沒有簡單的方法來做到這一點。就像雷切爾提到的那樣,循環瀏覽這些項目似乎是要走的路。但是我不想過多地從ItemsControl.AlternationIndex附帶的屬性中構建,因爲這是人們所期望的。因爲它是隻讀的,所以我不得不通過反射來訪問它,但是之後事情就會落空。

首先,確保處理TreeViewItem的Loaded,Expanded和Collapsed事件。在事件處理程序中查找擁有的TreeView並對所有可見節點執行遞歸交替計數集。我創建了一個擴展方法來處理它:

public static class AlternationExtensions 
    { 

    private static readonly MethodInfo SetAlternationIndexMethod; 

    static AlternationExtensions() 
    { 
     SetAlternationIndexMethod = typeof(ItemsControl).GetMethod(
     "SetAlternationIndex", BindingFlags.Static | BindingFlags.NonPublic); 
    } 

    public static int SetAlternationIndexRecursively(this ItemsControl control, int firstAlternationIndex) 
    { 
     var alternationCount = control.AlternationCount; 
     if (alternationCount == 0) 
     { 
      return 0; 
     } 

     foreach (var item in control.Items) 
     { 
      var container = control.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem; 
      if (container != null) 
      { 
       var nextAlternation = firstAlternationIndex++ % alternationCount; 
       SetAlternationIndexMethod.Invoke(null, new object[] { container, nextAlternation }); 
       if (container.IsExpanded) 
       { 
        firstAlternationIndex = SetAlternationIndexRecursively(container, firstAlternationIndex); 
       } 
      } 
     } 

     return firstAlternationIndex; 
    } 
} 

正如您所看到的,它貫穿每個節點並設置自定義替代索引。它檢查節點是否展開,如果是,繼續在子節點上進行計數。

上面我提到你必須處理TreeViewItem的Loaded事件。如果您只處理展開和摺疊的事件,您將無法獲得首次打開節點時創建的新容器。因此,當創建子節點並將其添加到可視化樹中時,您必須執行新的傳遞。

0

我用javascript做的事情是創建一個表的OnLoaded事件,該表通過錶行循環,如果該行可見,則將背景顏色設置爲nextColor變量,並將nextColor變量更改爲相反顏色。這可能在這裏工作。

+1

我不太清楚你將如何使用JavaScript來遍歷WPF中的TreeView。我很確定這不起作用。 – jjrdk 2010-08-06 21:15:58

+0

我的意思是你可以在TreeView的OnLoaded事件中使用類似的邏輯....循環遍歷樹視圖項並根據其可見與否以及最後使用的顏色設置背景顏色。 – Rachel 2010-08-07 23:19:46