根据可见性定义TreeView交替行的背景颜色

3

在WPF中,有没有一种方法来定义交替可见行的背景?

我尝试设置AlternationCount属性,但它会为每个子节点重新启动,这看起来很奇怪。

理想情况下,我想知道给定节点的可视索引是什么。只计算展开的节点。

2个回答

4
这并不容易,因为WPF为树节点创建了嵌套容器。所以正如Rachel提到的那样,循环遍历项似乎是可行的方式。但是我不想偏离内置的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
我的意思是你可以使用类似的逻辑...在TreeView的OnLoaded事件中,循环遍历树形视图项,并根据其可见性和上次使用的颜色设置背景颜色。 - Rachel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接