Панель SplitContainer для автоматического размещения содержимого

Я ищу довольно простую функциональность, однако не могу ее найти (и, что удивительно, я не могу найти никого, кто задает этот вопрос).

У меня есть разделенный контейнер с двумя панелями - довольно простая настройка, навигационный TreeView слева, ListView с элементами справа.

Теперь я хотел бы, чтобы сплиттер автоматически фиксировался в положении, когда все слева (дерево) видно, а горизонтальная полоса прокрутки не отображается. Я не знаю заранее размер элементов (но я знаю, что это только 1 уровень). Что-то вроде «Авторастить, а затем исправить сплиттер». Наверняка я не первый, кто ищет этот функционал :)

Есть идеи, как этого добиться?

Спасибо, Мартин


person Martin Zugec    schedule 23.04.2013    source источник


Ответы (1)


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

Private Shared Function GetMaxNodeWidth(ByVal nodes As TreeNodeCollection, ByVal width As Integer) As Integer
    For Each node As TreeNode In nodes
        width = Math.Max(width, node.Bounds.Right)
        width = GetMaxNodeWidth(node.Nodes, width)
    Next
    Return width
End Function

Public Shared Function ResizeTreeView(ByVal tree As TreeView) As Integer
    Dim width = GetMaxNodeWidth(tree.Nodes, 0)
    tree.ClientSize = New Size(width, tree.ClientSize.Height)
    return tree.Width
End Sub

Вызовите ResizeTreeView() после заполнения элемента управления. Пример использования:

    TreeView1.Nodes.Add("Customers")
    '' etc...
    SplitContainer1.SplitterDistance = ResizeTreeView(TreeView1)
person Hans Passant    schedule 23.04.2013