首先,我将大致展示我在这里尝试完成的工作。 想要的效果。 请注意,这并不准确,因为当前系统无法正常工作。这就是我在这里的原因。
我一直在尝试解决这个问题一段时间。到目前为止,我得到了这段代码,但它不能正常工作。
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;
}
相反,它创建了这个:
我提供的信息可能太少了,但我不确定需要多少。询问更多信息。谢谢!
由于新帐户,不让我发布图像。
编辑 我忘了说,在我的系统中,坐标是相对于父级的。
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;
}