Прежде всего, я покажу примерно то, что я пытался сделать здесь. The desired effect. Обратите внимание, что это не так, потому что текущая система не работает. Вот почему я здесь.Сортировка массива визуальных узлов
Я пытался решить эту проблему в течение некоторого времени. Я получил этот код до сих пор, но он работает неправильно.
public double UpdateChildPosition(bool fromParent)
{
if (children.Count == 0)
return 0;
if (!fromParent && parentnode != null)
{
parentnode.UpdateChildPosition(false);
return 0;
}
double cwidth = 0;
if ((fromParent && children.Count > 0) || parentnode == null)
children.ForEach((n) => cwidth += n.UpdateChildPosition(true));
double width = children.Sum((n) => n.rectangle1.Width + 10) + cwidth/2;
double x = 0 - width/2;
foreach (MindmapNode node in children)
{
node.x = x;
x += node.rectangle1.Width + 10 + cwidth/children.Count;
node.y = 50;
}
return width;
}
Вместо этого, он создает это:
Picture of the current effect http://img29.imageshack.us/img29/9660/effectg.png
Я дал возможно немного слишком мало информации, но я точно не знаю, сколько нужно. Запросите дополнительную информацию. Спасибо!
Не разрешил мне отправлять изображения из-за новой учетной записи.
EDIT Я забыл сказать, что в моей системе координаты относительно родителя.
EDIT2 Я немного продвинулся вперед. Текущая проблема: при изменении размеров узлов (да, они динамические) они перекрываются.
List<MindmapNode> children;
public double UpdateChildPosition(bool fromParent)
{
if (children.Count == 0)
return rectangle1.Width + 10;
if (!fromParent && parentnode != null)
{
parentnode.UpdateChildPosition(false);
return 0;
}
double[] childrenwidth = new double[children.Count];
//if ((fromParent && children.Count > 0) || parentnode == null)
List<MindmapNode> rchildren = (from n in children
where n.moved == false
select n).ToList();
(from n in children
where rchildren.Contains(n) == false
select n).ToList().ForEach((n) => n.UpdateChildPosition(true));
int i = 0;
rchildren.ForEach((n) => childrenwidth[i++] =
Math.Max(n.UpdateChildPosition(true), (n.children.Count > 0) ? n.rectangle1.Width * 2 : 0));
double width = childrenwidth.Sum();
double x = -width/2;
i = 0;
foreach (MindmapNode node in rchildren)
{
x += childrenwidth[i]/2;
node.x = x;
x += childrenwidth[i]/2;
node.y = 50;
i++;
node.SetOrigin();
}
return width;
}
С какой проблемой вы столкнулись? Я не вижу никакой разницы между текущим и желаемым. –
@PieterGeerkens он хочет, чтобы каждая группа дочерних узлов была центрирована под своим родительским узлом, похоже. Я не могу сказать, хочет ли он, чтобы зеленые узлы или фиолетовые узлы были равномерно распределены; выбор между этими двумя подразумевает разные подходы к проблеме. – Random832
@ Random832: Получил это сейчас; TY. –