2010-07-14 41 views
4

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

+2

您是使用Winforms,WPF还是其他? – 2010-07-14 16:47:59

+2

要做这样的事情,我添加一个* FlowLayoutPanel *,然后以一些奇特的方式添加我的控件。 – Luiscencio 2010-07-14 17:13:07

+0

Just WinForms ... – MarkP 2010-07-14 17:15:28

回答

6

ListBox的设计不是一个容器控件。它的滚动条不能滚动控件。一般来说,你想要避免的是,在AutoScroll属性为True的面板中放置很多控件会使你的UI无响应。控件是昂贵的对象。

看看ListBox.DrawItem事件。您可以绘制自己的项目,并使其看起来与Graphics类方法一样。而且非常便宜。该活动的MSDN Library article中有一个很好的例子。

0

这对于WPF来说非常简单,只需使用基本构图即可。在WinForms世界中,您可能需要将容器作为自定义控件。

+0

我从来没有真正使用过WPF,所以我会坚持使用WinForms。所以容器和物品必须是自定义控件。 – MarkP 2010-07-14 17:11:10

+0

容器将是,项目可能不必。据推测,你的自定义容器将包含一个'Control'对象的集合。 – 2010-07-14 17:16:53

2

我已经完成了这之前不使用FlowLayoutPanel,但只是一个普通的面板与控制停靠在顶部。你可以添加一个滚动条等。

这对于一些控件很适用。不止一些,它开始真的放慢速度。如果你有时间的话,我会考虑在它的位置绘制一个假控件,如Hans Passant's answer,然后当用户点击其中一个项目时,用一个看起来完全一样的真实控件替换它。当该物品失去焦点时,处置它并更改底层列表。

+0

你偷了我的评论,并把它变成一个答案...辉煌! – Luiscencio 2010-07-14 18:45:13

+1

@Luiscencio - 实际上,这更多的是回应你的评论。注意我说我*没有*使用FlowLayoutPanel,而是一个简单的Panel。原因是如果你想模拟一个列表框,它们都是垂直排列的,而不是在FlowLayoutPanel的“流”布局中。 (此外,如果你想让你的评论成为一个答案,你应该已经发布了它作为答案。) – dlras2 2010-07-14 18:49:16

+2

我仍然爱你 – Luiscencio 2010-07-14 18:55:32

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