6

J'ai beaucoup d'images stockées dans un stockage isolé et je veux les afficher dans une liste. Cependant, je ne veux pas que toutes les images soient chargées tout de suite mais paresseusement. Ainsi, uniquement lorsque l'utilisateur fait défiler pour voir de nouveaux éléments, les images doivent être chargées. Je souhaite également utiliser la liaison de données pour fournir les données et l'image de l'élément de liste. Dans les tests, j'ai fait que toutes les images ont été chargées immédiatement et immédiatement, donc je ne suis pas sûr que ce chargement paresseux puisse être réalisé avec la liaison par défaut ListBox et la liaison de données. Peut-il?Chargement paresseux des images de la liste à partir du stockage isolé

+0

Vous pouvez consulter ce blog et la vidéo channel9 pour en savoir plus. Le code source est également 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 –

Répondre

7

Vous pouvez utiliser la ListBox standard pour "charger par lots" vos éléments avec la liaison de données. Le mot clé ici est "virtualisation de données". Vous devez implémenter IList dans la classe que vous voulez cataloguer. La méthode de l'indexeur ne sera appelée que pour les éléments actuellement visibles et pour les prochains ~ 2 écrans calculés. C'est également la raison pour laquelle vous devez utiliser une grille de taille fixe pour votre mise en page d'article, et non une pile avec une hauteur calculée basée sur tous les éléments contenant (performance!).

Vous n'avez pas à implémenter tous les membres IList, seulement quelques-uns. Voici un exemple:

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 
} 

Alors que le débogage, vous pouvez voir que tous les éléments sont chargés à la fois, mais seulement en cas de besoin (voir Debug.WriteLine()).

+2

C'est génial, merci! Fonctionne parfaitement. Le mot clé est vraiment "virtualisation de données" - googling il m'a amené à la page de Shawn Oster qui élabore également un peu sur le sujet: http://shawnoster.com/blog/post/Improving-ListBox-Performance-in-Silverlight- pour-Windows-Phone-7-Data-Virtualization.aspx –

+0

Et juste pour l'enregistrement: je n'ai pas lié à un IList en premier lieu, je lié à une liste. Remplacer cette liste par l'IList semble faire l'affaire. –

+0

Je sais que c'était pour toujours, mais en utilisant une collection observable fait exactement la même chose oui? – Nico

1

Contrôle this Implémentation LazyListBox. Cette ListBox chargera le modèle complexe pour les éléments visibles à l'écran. Pour les éléments non visibles à l'écran, vous définissez un modèle simple.

+0

Merci pour le lien, c'est très intéressant à lire. Pour l'instant, la solution d'Anheledir est suffisante pour mes fins. Mais pour l'avenir, je garderai un œil sur le LazyListBox. –

Questions connexes