2010-08-06 57 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