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/