Список WinForms, содержащий пользовательские элементы управления? - PullRequest
4 голосов
/ 14 июля 2010

Можно ли создать список со списком пользовательских элементов управления?Я бы предположил, что вам, возможно, придется вызывать какой-то пользовательский рисунок дочерних объектов, но я не знаю, как это сделать.Кто-нибудь может пролить свет на это?

Ответы [ 5 ]

6 голосов
/ 14 июля 2010

ListBox не предназначен для управления контейнером. Его полоса прокрутки не может прокручивать элементы управления. Как правило, это то, чего вы хотите избежать, если поместить множество элементов управления, скажем, в панель, свойство AutoScroll которой равно True, и ваш пользовательский интерфейс будет не отвечать. Органы управления дорогими объектами.

Посмотрите на событие ListBox.DrawItem. Вы можете нарисовать свой собственный элемент и заставить его выглядеть так, как вы хотите, с помощью методов класса Graphics. И это очень дешево. В статье MSDN Library есть очень хороший пример для события.

2 голосов
/ 14 июля 2010

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

Это работает довольно хорошо для нескольких элементов управления. Больше чем несколько, и это начинает действительно замедляться. Если у вас есть время, я бы посмотрел на рисование фальшивого элемента управления на его месте, как в ответ Ханса Пассанта , затем, когда пользователь щелкает один из элементов, замените его реальным элементом управления, который выглядит точно так же. Когда этот элемент потеряет фокус, удалите его и измените базовый список.

1 голос
/ 12 августа 2014

Возможно, это то, что вы ищете: Гибкий контроль списка

Я написал эту статью некоторое время назад.

0 голосов
/ 05 октября 2015
    private void OnDrawItem(object sender, DrawItemEventArgs e)
    {
        Rectangle rect = e.Bounds;
        rect.Offset(0, -rect.Top);
        using (Bitmap bitmap = new Bitmap(rect.Width, rect.Height))
        {
            Control control = (Control)listBox.Items[e.Index];
            control.DrawToBitmap(bitmap, rect);
            rect = e.Bounds;
            e.Graphics.DrawImage(bitmap, e.Bounds);
        }
    }
0 голосов
/ 14 июля 2010

Это довольно легко с WPF, просто используйте базовую композицию. В мире WinForms вам, вероятно, потребуется сделать контейнер настраиваемым элементом управления.

...