我正在编写一个显示图像缩略图的小应用程序。所有显示的图像都在同一个目录中,每个图像都在它自己的组框内,带有一些标签和一个复选框。所有的分组框都被添加到一个 flowlayoutpanel 中。问题是,图像的数量可能会变得非常大,我担心如果我加载所有图像,即使它们还不可见,内存使用/性能可能会有点失控。
有没有办法只加载用户当前可见的图像?我的第一个想法是存储我的框的位置并根据滚动位置确定要加载的图像,或者是否有更简单的方法来确定图片框/组框当前是否可见?
我正在编写一个显示图像缩略图的小应用程序。所有显示的图像都在同一个目录中,每个图像都在它自己的组框内,带有一些标签和一个复选框。所有的分组框都被添加到一个 flowlayoutpanel 中。问题是,图像的数量可能会变得非常大,我担心如果我加载所有图像,即使它们还不可见,内存使用/性能可能会有点失控。
有没有办法只加载用户当前可见的图像?我的第一个想法是存储我的框的位置并根据滚动位置确定要加载的图像,或者是否有更简单的方法来确定图片框/组框当前是否可见?
理想情况下,您应该做的是创建缓冲区逻辑,而不是隐藏一张图像并显示另一张图像。在显示图像之前有几个缓冲区加载图像并使用固定数量的实际字段显示图像而不是每个图像的新集合是一个更好的主意。
但如果您的解决方案需要,请尝试创建自定义用户控件。
尝试这样的事情:
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;
}
}
}