Вы можете отрисовать дерево рекурсивно и отслеживать глубину, на которой вы находитесь, чтобы определить уровень отступа.
Как в:
rootNode.RenderTree(0, 0); // Recursively draw root node at (0,0)
...
void RenderTree(int depth, ref int y)
{
// Draw this Node at position (depth * indentAmount, y)
... whatever you like here to get the style of items that you want...
depth++; // Increase indent level (X pos) for all children
y += thisNode.Height; // After drawing each item, move down the page
// Now recurse to draw all children
foreach (Node childNode in Children)
childNode.RenderTree(depth, ref y);
}
Есть немного больше работы, чтобы нарисовать соединительные линии (вам нужно использовать уровень глубины, чтобы указать, сколько линий нужно нарисовать), но это по сути.
Обратите внимание, что мы передаем y как ref
, так что каждый элемент перемещает местоположение рисования вниз по странице последовательно, но мы передаем глубину по значению, поскольку она постоянна для всех дочерних элементов на одном и том же уровне дерева.
(Обратите внимание, что этот псевдокод очень похож на ваш метод Arrange - просто измените имя и передайте объект Graphics, и он в значительной степени заменяет плагин. Я оставлю вам решать, как рисовать линии, круги и текст для каждого элемента, хотя: -)