仅在需要/可见时将图像加载到图片框中

时间:2012-02-04 09:19:21

标签: c# image scroll picturebox groupbox

我正在编写一个显示图像缩略图的小应用程序。所有显示的图像都在同一目录中,每个图像都在其自己的组合框中,并带有一些标签和一个复选框。所有组框都添加到flowlayoutpanel。问题是,图像的数量可能会变得非常大,我担心如果我加载所有图像,即使它们还不可见,内存使用/性能可能会有点失控。

有没有办法只加载用户当前可见的图片?我的第一个想法是存储我的盒子的位置,并根据滚动位置确定要加载哪些图像,或者是否有更简单的方法来确定图片框/组框当前是否可见?

1 个答案:

答案 0 :(得分:1)

理想情况下,您应该做的是创建缓冲区逻辑而不是隐藏1个图像并显示另一个图像。在显示图像之前让一对缓冲区加载图像并且具有固定数量的实际字段显示图像而不是每个图像的新集合是一个更好的主意。

但是,如果您的解决方案需要,请尝试创建自定义用户控件。

尝试这样的事情:

public class customUserControl : UserControl
{
    //Store image as a Uri rather than an Image
    private Uri StoredImagePath;
    public class PictureBoxAdv : PictureBox
    {
        public PictureBoxAdv()
        {
            this.VisibleChanged +=new EventHandler(VisibleChanged);
        }
    }
    public Uri Image
    {
        get { return StoredImagePath; }
        set
        {
            StoredImagePath = value;
            if (this.Visible && StoredImagePath != null)
            {
                this.Image = Image.FromFile(StoredImagePath.AbsolutePath);
            }
        }
    }
    public void VisibleChanged(object sender, EventArgs e)
    {
        //When becomes visible, restore image, invisible, nullify.
        if (this.Visible && StoredImagePath != null)
        {
            this.Image = Image.FromFile(StoredImagePath.AbsolutePath);
        }
        else
        {
            this.Image = null;
        }
    }
}