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

5

是否可能制作一个列出一堆自定义控件的列表框?我想你可能需要调用某些子对象的自定义绘制,但我不知道如何做到这一点。有人可以解释一下吗?


2
你使用Winforms、WPF还是其他的东西? - Zach Johnson
2
为了做这样的事情,我添加一个 FlowLayoutPanel 然后使用一些炫酷的方式将我的控件添加到它上面。 - Luiscencio
有没有一种方法可以强制 FlowLayoutPanel 上的滚动条出现? - MarkP
是的,我不太记得了,但我认为是autoscroll属性。你可能想要双缓冲您的表单,这样在滚动时就不会出现闪烁 =] - Luiscencio
  1. 我认为 FlowLayoutPanel 解决方案最大的缺陷是无法知道列表中选择了哪个“对象”,需要自己实现。
  2. 要显示滚动条,只需将 AutoScroll 属性设置为 true。
- itsho
5个回答

8
ListBox不是一个容器控件,它的滚动条不能滚动控件。一般情况下,你应该避免将大量控件放在ListBox中,比如把它们放在一个AutoScroll属性为True的Panel中会导致UI无响应。因为控件是昂贵的对象。
请看ListBox.DrawItem事件。你可以使用Graphics类方法绘制自己想要的外观,并且代价非常小。这个事件在MSDN文档中有很好的示例。

3
我以前做过这个,不是使用FlowLayoutPanel,而是使用普通的Panel,并将控件Docked到顶部。您可以添加滚动条等。
这对于少量控件非常有效。但是如果超过几个,则会变得非常缓慢。如果您有时间,建议研究一下像Hans Passant's answer中所示的绘制假控件的方法,然后当用户点击其中一个项目时,用真正的控件替换它,两者看起来完全一样。当该项失去焦点时,将其释放并更改底层列表。

1
@Luiscencio - 实际上,这更像是对你评论的回答。请注意我说我没有使用FlowLayoutPanel,而是一个简单的Panel。原因是如果你想模拟一个列表框,它们都是垂直排列的,而不是从FlowLayoutPanel中的“流”布局排列。(另外,如果你希望你的评论成为答案,你应该将其发布为答案。) - dlras2
1
@Luiscencio - 我打算停止尝试检测讽刺,只是简单地回复一个“谢谢” =] - dlras2

1

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

0

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


我从未真正使用过WPF,所以我会坚持使用WinForms。因此容器和项目必须是自定义控件。 - MarkP
容器可以是自定义的,但其中的项目可能不需要是。假设您的自定义容器将包含一组“Control”对象。 - Greg D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接