Загружать изображение в картинку только когда нужно / видно - PullRequest
0 голосов
/ 04 февраля 2012

Я программирую небольшое приложение, которое показывает эскизы изображений. Все отображаемые изображения находятся в одном каталоге, каждое изображение находится в своем собственном групповом окне с несколькими метками и флажком. Все групповые блоки добавляются в панель потока. Проблема заключается в том, что количество изображений может стать довольно большим, и я обеспокоен тем, что использование / производительность памяти может немного выйти из-под контроля, если я загружу все изображения, даже если они еще не видны.

Есть ли способ загрузить только изображения, которые в данный момент видны пользователю? Моя первая мысль - сохранить расположение моих ящиков и определить, какие изображения загружать, в зависимости от положения прокрутки, или есть более простой способ определить, виден ли в данный момент ящик с картинками / групповые окна?

1 Ответ

1 голос
/ 04 февраля 2012

В идеале вы должны создавать буферную логику, а не прятать одно изображение и показывать другое.Намного лучше иметь пару буферов, загружающих изображения перед их отображением, и иметь фиксированное количество действительных полей, отображающих изображения, а не новый набор для изображения.

Но если ваше решение требует этого, попробуйте создать пользовательский элемент управления.

Попробуйте что-то вроде этого:

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