在WPF中,有没有一种方法来定义交替可见行的背景?
我尝试设置AlternationCount属性,但它会为每个子节点重新启动,这看起来很奇怪。
理想情况下,我想知道给定节点的可视索引是什么。只计算展开的节点。
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事件。如果你只处理展开和折叠事件,当一个节点首次打开时,你将无法获得新创建的容器。因此,在子节点被创建并添加到可视树中时,您必须进行新的遍历。