6

Tengo muchas imágenes almacenadas en almacenamiento aislado y quiero mostrarlas en un cuadro de lista. Sin embargo, no quiero que todas las imágenes se carguen de inmediato, sino de forma perezosa. Entonces, solo cuando el usuario se desplaza para ver nuevos elementos, las imágenes deben cargarse. También quiero utilizar el enlace de datos para proporcionar los datos e imágenes del elemento de la lista.Carga difusa de imágenes de cuadro de lista de almacenamiento aislado

En las pruebas que realicé todas las imágenes siempre se cargaron de inmediato y de inmediato, por lo que no estoy seguro si esta carga diferida se puede lograr con el valor predeterminado ListBox y el enlace de datos. ¿Puede?

+0

Puede consultar este blog y el video de channel9 sobre lo mismo. El código fuente también está disponible. http://channel9.msdn.com/Shows/SilverlightTV/Silverlight-TV-72-Windows-Phone-Tips-for-Loading-Images http://jobijoy.blogspot.com/2011/05/wp7dev-tip-2 -few-things-to-remember-on.html –

Respuesta

7

Puede usar el ListBox estándar para "cargar de forma difusa" sus elementos con enlace de datos. La palabra clave aquí es "virtualización de datos". Tienes que implementar IList a la clase que deseas vincular. El método del indexador solo se llamará para los elementos actualmente visibles y para las siguientes pantallas ~ 2 calculadas. Esta es también la razón por la que debe usar una cuadrícula de tamaño fijo para el diseño de su artículo, no un panel de distribución con una altura calculada basada en todos los elementos que lo contienen (¡rendimiento!).

No tiene que implementar todos los miembros de IList, solo unos pocos. Aquí está un ejemplo:

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 
} 

Mientras que la depuración se puede ver que no todos los artículos se cargan a la vez, pero sólo cuando es necesario (ver Debug.WriteLine()).

+2

¡Eso es genio, gracias! Funciona perfecto La palabra clave es realmente "virtualización de datos": buscar en Google me llevó a la página de Shawn Oster, quien también desarrolla un poco sobre el tema: http://shawnoster.com/blog/post/Improving-ListBox-Performance-in-Silverlight- para-Windows-Phone-7-Data-Virtualization.aspx –

+0

Y solo para el registro: no me vinculé a un IList en primer lugar, me até a una lista. Reemplazar esta lista con IList parece estar haciendo el truco. –

+0

Sé que esto fue hace mucho tiempo, pero el uso de una colección observable hace exactamente lo mismo, ¿sí? – Nico

1

Verificar this Implementación de LazyListBox. Este ListBox cargará plantillas complejas para los elementos visibles en la pantalla. Para elementos no visibles en la pantalla, configura una plantilla simple.

+0

Gracias por el enlace, es muy interesante de leer. Por ahora, la solución de Anheledir es suficiente para mis propósitos. Pero en el futuro estaré atento al LazyListBox. –

Cuestiones relacionadas