包含自定义控件的WinForms列表框?

时间:2010-07-14 16:45:43

标签: c# winforms listbox custom-controls

是否可以制作列出一堆自定义控件的列表框?我假设你可能不得不调用某种子对象的自定义绘图,但我不知道该怎么做。任何人都可以对此有所了解吗?

5 个答案:

答案 0 :(得分:6)

ListBox不是设计为容器控件。其滚动条无法滚动控件。这通常是你想要避免的东西,比如在一个Panel中放置很多控件,其AutoScroll属性为True将使你的UI无响应。控制是昂贵的对象。

看一下ListBox.DrawItem事件。您可以使用Graphics类方法绘制自己的项目并使其看起来像您想要的那样。它非常便宜。事件的MSDN Library article有一个很好的例子。

答案 1 :(得分:2)

我之前没有使用FlowLayoutPanel,而只是一个普通的Panel控件停靠在顶部。您可以添加滚动条等。

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

答案 2 :(得分:1)

也许这就是你要找的东西: Flexible List Control

我在一段时间后写了这篇文章。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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