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

标签 wpf treeview

WPF中有没有办法定义交替可见行的背景?

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

理想情况下,我想要知道给定节点的视觉索引是什么。仅计算扩展节点。

最佳答案

没有简单的方法可以做到这一点,因为 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 事件。如果您只处理展开和折叠事件,您将无法获得首次打开节点时创建的新容器。因此,当创建子节点并将其添加到可视化树时,您必须执行一次新的传递。

关于wpf - 根据可见性定义交替 TreeView 行的背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3425385/

相关文章:

javascript - 使用 jquery 从文件中获取 JSON 数据

c# - 绑定(bind)到 WPF 中的 TreeView

c# - 右键单击选择一个 TreeViewItem

WPF - 无法停止动画 StoryBoard,IsControllable 不起作用?

.net - WPF中的树状网格/分层网格

c# - WPF 无法聚焦 TextBox

java - Eclipse 插件 - TreeViewer 显示大量文本

Delphi TreeView 选择丢失

c# - 旋转 slider WPF

c# - 应用程序级别的全面错误处理?