Как дважды щелкнуть представление разделителя, чтобы изменить ширину - PullRequest
0 голосов
/ 01 апреля 2010

У меня есть форма, которая очень похожа на Windows Explorer. С левой стороны у меня есть элемент управления в виде дерева, а справа - обычная панель. Я хочу иметь возможность дважды щелкнуть представление разделителя, чтобы изменить размер в зависимости от ширины самой длинной метки в представлении дерева. Кто-нибудь знает хороший способ сделать это?

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

Ответы [ 2 ]

1 голос
/ 01 апреля 2010

Это сработало:

    private static int GetNodeBounds(TreeNodeCollection nodes) {
        int w = 0;
        foreach (TreeNode node in nodes) {
            w = Math.Max(w, node.Bounds.Right);
            if (node.Nodes.Count > 0)
                w = Math.Max(w, GetNodeBounds(node.Nodes));
        }
        return w;
    }

Пример использования:

    treeView1.ClientSize = new Size(GetNodeBounds(treeView1.Nodes), treeView1.ClientSize.Height);

Помните, что значение, возвращаемое GetNodeBounds (), может измениться, когда пользователь расширяет узлы. Он может видеть только ширину видимых узлов.

1 голос
/ 01 апреля 2010

Вы можете перебирать список узлов (используя любые критерии, которые вы решите - все узлы, только видимые), и вы сможете вычислить ширину для любого конкретного узла, выполнив что-то вроде этого:

int theWidth = theTextWidth + theIndentSize * theIndentLevel + theImageWidth;

Вы можете рекурсивно пройтись по дереву (опять же, пропуская невидимые узлы, если это ваша реализация) и вернуть theWidth из вызова, сравнивая его с ранее вычисленной maxWidth, и эта maxWidth должна быть довольно близка к ширине дерева. (плюс отступы, поля и т. д.). Затем установите расстояние сплиттера до этого значения.

...