Сортировка массива визуальных узлов

Прежде всего, я покажу примерно то, что я пытался сделать здесь. Желаемый эффект. Обратите внимание, что это не точно, потому что текущая система не работает. Вот почему я здесь.

Я пытался решить эту проблему в течение некоторого времени. Я получил этот код до сих пор, но он не работает должным образом.

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;
    }

Вместо этого он создает это:

http://img29.imageshack.us/img29/9660/effectg.png

Я дал, может быть, слишком мало информации, но я не совсем уверен, сколько нужно. Спросите дополнительную информацию. Спасибо!

Не позволил мне публиковать изображения из-за новой учетной записи.

РЕДАКТИРОВАТЬ Я забыл сказать, в моей системе координаты относительно родителя.

РЕДАКТИРОВАТЬ 2 Я сделал немного прогресса. Текущая проблема: когда размеры узлов меняются (да, они динамические), они перекрываются.

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;
    }

1 ответ

Это должно работать для каждого родителя:

X = ( (children.Last.Right - children.First.Left) / 2 ) - Width / 2;

Мне кажется, что это определение того, что нужно, переведено прямо в код.

Другие вопросы по тегам