关于包含自定义控件的 c#:WinForms 列表框?

WinForms listbox containing custom controls?

是否可以制作一个列出一堆自定义控件的列表框?我假设您可能必须调用子对象的某种自定义绘图,但我不知道该怎么做。有人能解释一下吗?


ListBox 并非设计为容器控件。它的滚动条不能滚动控件。这通常是您要避免的事情,将大量控件放入,例如,AutoScroll 属性为 True 的 Panel 会使您的 UI 无响应。控件是昂贵的对象。

看看 ListBox.DrawItem 事件。您可以使用 Graphics 类方法绘制自己的项目并使其看起来符合您的要求。而且它非常便宜。在 MSDN 库文章中有一个非常好的例子。


我以前不是通过使用 FlowLayoutPanel 来完成此操作的,而是使用一个带有停靠在顶部的控件的普通面板。您可以添加滚动条等。

这对一些控件非常有效。不止几个,它开始真正放慢速度。如果您有时间,我会考虑在其位置绘制一个假控件,就像在 Hans Passant 的回答中一样,然后当用户单击其中一个项目时,将其替换为看起来完全相同的真实控件。当该项目失去焦点时,将其释放并更改基础列表。


也许这就是您要寻找的东西:
灵活的列表控制

我之前写过那篇文章。


1
2
3
4
5
6
7
8
9
10
11
12
    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);
        }
    }

使用 WPF 很容易,只需使用基本组合即可。在 WinForms 世界中,您可能需要将容器设置为自定义控件。