gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:11:09 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com