Ленивая загрузка изображений списков из изолированного хранилища - PullRequest
6 голосов
/ 30 мая 2011

У меня много изображений, хранящихся в изолированном хранилище, и я хочу отобразить их в списке.Однако я не хочу, чтобы все изображения загружались сразу, но лениво.Таким образом, только когда пользователь прокручивает, чтобы увидеть новые элементы, изображения должны быть загружены.Я также хочу использовать привязку данных для предоставления данных и изображения элемента списка.

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

Ответы [ 2 ]

7 голосов
/ 30 мая 2011

Вы можете использовать стандартный 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 ()).

1 голос
/ 30 мая 2011

Проверьте это реализация LazyListBox.Этот ListBox загрузит сложный шаблон для элементов, видимых на экране.Для элементов, не видимых на экране, вы устанавливаете простой шаблон.

...