关于包含自定义控件的 c#:WinForms 列表框?
WinForms listbox containing custom controls?
是否可以制作一个列出一堆自定义控件的列表框?我假设您可能必须调用子对象的某种自定义绘图,但我不知道该怎么做。有人能解释一下吗?
相关讨论
- 您使用的是 Winforms、WPF 还是其他东西?
- 为了做这种事情,我添加了一个 FlowLayoutPanel,然后以某种花哨的方式添加我的控件。
- 有没有办法强制 FlowLayoutPanel 上的滚动条出现?
- 是的,不记得确切,但我认为是 autoscroll 道具。,您可能希望双缓冲您的表单,以便滚动时不会发生闪烁 =]
- @MarkP:1. 我认为 FlowLayoutPanel 解决方案中最大的缺失是能够知道选择了列表中的哪个"对象",并且您需要自己实现它。 2.要显示滚动条,只需将属性 AutoScroll 设置为 true。
ListBox 并非设计为容器控件。它的滚动条不能滚动控件。这通常是您要避免的事情,将大量控件放入,例如,AutoScroll 属性为 True 的 Panel 会使您的 UI 无响应。控件是昂贵的对象。
看看 ListBox.DrawItem 事件。您可以使用 Graphics 类方法绘制自己的项目并使其看起来符合您的要求。而且它非常便宜。在 MSDN 库文章中有一个非常好的例子。
我以前不是通过使用 FlowLayoutPanel 来完成此操作的,而是使用一个带有停靠在顶部的控件的普通面板。您可以添加滚动条等。
这对一些控件非常有效。不止几个,它开始真正放慢速度。如果您有时间,我会考虑在其位置绘制一个假控件,就像在 Hans Passant 的回答中一样,然后当用户单击其中一个项目时,将其替换为看起来完全相同的真实控件。当该项目失去焦点时,将其释放并更改基础列表。
相关讨论
- @Luiscencio - 实际上,这更像是对您的评论的回应。注意我说我没有使用 FlowLayoutPanel,而是一个简单的面板。这样做的原因是如果你想模拟一个列表框,它们都是垂直排列的,而不是在 FlowLayoutPanel 的"流"布局中。 (此外,如果您希望您的评论成为答案,您应该将其发布为答案。)
- @Luiscencio - 我将停止尝试检测讽刺,并简单地回复"谢谢"=]
也许这就是您要寻找的东西:
灵活的列表控制
我之前写过那篇文章。
|
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 世界中,您可能需要将容器设置为自定义控件。
相关讨论
- 我从未真正使用过 WPF,所以我会坚持使用 WinForms。所以容器和项目必须是自定义控件。
-
容器是,物品可能不是。大概您的自定义容器将包含
Control 对象的集合。