6

我正在尝试制作ImageListBox一种可以显示大量缩略图的控件,例如 Picasa 使用的控件。

这是我的设计:

我有一个FlowLayoutPanel填充了很多对象的UserControl对象,例如 4,000 个。每个人都UserControl被分配了一个代表该Paint事件。当Paint事件被调用时,它会检查缩略图的内存缓存,如果图像不在缓存中,它会从磁盘中检索它。

我有两个要解决的问题:

  1. Paint即使UserControl不在视图中,WinForms 似乎也会触发一个事件。实际上只有 10 个左右的控件在视图中,其余的不是(FlowLayoutPanel.AutoScroll设置为true)。结果,它尝试检索所有图像的缩略图,这需要很长时间。

  2. UserControl对象添加到其中FlowLayoutPanel需要一些较长的时间,大约 2-3 秒。我可以忍受它,但我想知道是否有比以下更好的方法:

    UserControl[] boxes = new UserControl[N];
    // populate array
    panel.SuspendLayout();
    panel.Controls.AddRange(boxes);
    panel.ResumeLayout();
    
4

3 回答 3

7

要提高使用用户控件填充 FlowLayoutPanel 的速度,请在添加控件时禁用布局更新。

在你的循环之前,先调用SuspendLayout(),然后在结束调用ResumeLayout()ResumeLayout()即使发生异常,也要确保使用 try-finally 来保证运行。

于 2009-01-24T20:29:01.680 回答
3

我不会添加那么多用户控件。相反,我将有一系列数据结构来存储有关要使用的缩略图、定位等信息,然后处理所需的每个缩略图的呈现。

当然,您只会渲染您需要的内容,方法是检查控件中的绘制事件参数并渲染视图中需要渲染的缩略图。

于 2009-01-22T21:32:53.783 回答
1

啊哈!我发现了一些东西。

当 UserControl 不在视图中并且它接收到 Paint 事件时,则 e.ClipRectangle.IsEmpty 为真!

于 2009-01-22T22:16:43.630 回答