关于包含自定义控件的 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 对象的集合。

以上是关于包含自定义控件的 c#:WinForms 列表框?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>