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 世界中,您可能需要将容器设置为自定义控件。