Мързеливо зареждане на изображения в списъчни кутии от изолирано хранилище

Имам много изображения, съхранени в изолирано хранилище и искам да ги покажа в списъчно поле. Въпреки това не искам всички изображения да се зареждат веднага, а мързеливо. Така че само когато потребителят превърта, за да види нови елементи, изображенията трябва да бъдат заредени. Също така искам да използвам обвързване на данни за предоставяне на данните и изображението на елемента от списъка.

В тестовете, които направих, всички изображения винаги се зареждаха веднага и наведнъж, така че не съм сигурен дали това отложено зареждане може да бъде постигнато с ListBox по подразбиране и обвързване на данни. Може ли?


person Heinrich Ulbricht    schedule 29.05.2011    source източник
comment
Можете да проверите този блог и видеоклипа на channel9, обсъждащ същото. Изходният код също е наличен. channel9.msdn.com/ Предавания/SilverlightTV/ jobijoy.blogspot.com/2011/05/   -  person Jobi Joy    schedule 30.05.2011


Отговори (2)


Можете да използвате стандартния ListBox за „мързеливо зареждане“ на вашите елементи с обвързване на данни. Ключовата дума тук е „виртуализация на данни“. Трябва да приложите IList към класа, който искате да свържете с данни. Методът на индексатора ще бъде извикан само за текущо видимите елементи и за следващите изчислени ~2 екрана. Това е и причината да използвате мрежа с фиксиран размер за оформлението на вашия артикул, а не стеков панел с изчислена височина въз основа на всички съдържащи елементи (производителност!).

Не е нужно да внедрявате всички членове на IList, а само няколко. Ето един пример:

    public class MyVirtualList : IList {
    private List<string> tmpList;

    public MyVirtualList(List<string> mydata) {
        tmpList = new List<string>();
        if (mydata == null || mydata.Count <= 0) return;
        foreach (var item in mydata)
            tmpList.Add(item);
    }

    public int Count {
        get { return tmpList != null ? tmpList.Count : 0; }
    }

    public object this[int index] {
        get {
            Debug.WriteLine("Just requested item #" + index);
            return tmpList[index];
        }
        set {
            throw new NotImplementedException();
        }
    }

    public int IndexOf(object value) {
        return tmpList.IndexOf(value as string);
    }

    public int Add(object value) {
        tmpList.Add(value as string);
        return Count - 1;
    }

    #region not implemented methods
    public void Clear() {
        throw new NotImplementedException();
    }

    public bool Contains(object value) {
        throw new NotImplementedException();
    }

    public void Insert(int index, object value) {
        throw new NotImplementedException();
    }

    public bool IsFixedSize {
        get { throw new NotImplementedException(); }
    }

    public bool IsReadOnly {
        get { throw new NotImplementedException(); }
    }

    public void Remove(object value) {
        throw new NotImplementedException();
    }

    public void RemoveAt(int index) {
        throw new NotImplementedException();
    }

    public void CopyTo(Array array, int index) {
        throw new NotImplementedException();
    }

    public bool IsSynchronized {
        get { throw new NotImplementedException(); }
    }

    public object SyncRoot {
        get { throw new NotImplementedException(); }
    }

    public IEnumerator GetEnumerator() {
        throw new NotImplementedException();
    }
    #endregion
}

Докато отстранявате грешки, можете да видите, че не всички елементи се зареждат наведнъж, а само когато е необходимо (вижте Debug.WriteLine()).

person Anheledir    schedule 30.05.2011
comment
Това е гениално, благодаря! Работи перфектно. Ключовата дума наистина е виртуализация на данни - гугъл ме отведе до страницата на Shawn Oster, който също разработва малко по темата: shawnoster.com/blog/post/ - person Heinrich Ulbricht; 31.05.2011
comment
И само за протокола: не се обвързах с IList на първо място, обвързах се със списък. Замяната на този списък с IList изглежда върши работа. - person Heinrich Ulbricht; 31.05.2011
comment
Знам, че това беше завинаги, но използването на наблюдаема колекция прави точно същото нещо, нали? - person Nico; 29.04.2012

Проверете това изпълнение на LazyListBox. Това ListBox ще зареди сложен шаблон за елементи, видими на екрана. За елементи, които не се виждат на екрана, задавате прост шаблон.

person Damian Antonowicz    schedule 29.05.2011
comment
Благодаря за линка, много е интересно да се чете. Засега решението на Anheledir е достатъчно за моите цели. Но за в бъдеще ще държа под око LazyListBox. - person Heinrich Ulbricht; 31.05.2011