Найден обходной путь для этой проблемы:
Обычно, когда TreeViewItem запускает событие OnCollapsed
или OnExpanded
, я заставляю все другие TreeViewItem определять свою собственную позицию на основе свойства IsExpanded
своих предков вплоть до корня дерева.
Если любой из предков свернут (т.е. IsExpanded == false
), я применяю его позицию к текущей позиции TreeViewItems.
Если ни один из предков не свернут, я применяю свою собственную позицию (тогда как позиция - это пользовательское свойство Point TreeViewItem).
Пример кода:
private Point DeterminePosition()
{
Point point = this.position;
if (ParentTreeViewItem != null)
{
MyTreeViewItem parent = null, lastCollapsed = null;
parent = ParentTreeViewItem;
while (parent != null)
{
if (parent.IsExpanded == false)
{
lastCollapsed = parent;
}
parent = parent.ParentTreeViewItem;
}
if (lastCollapsed != null)
{
point = new Point(position.X, lastCollapsed.Position.Y);
}
}
return point;
}