Archives journalières: 23 mai 2013

1 article

WPF, ListView d’images, MVVM et Drag and Drop… – Partie 3

Introduction

Vu précédemment

Nous avons vu dans la première partie comment implémenter une liste de fichiers en WPF avec le pattern MVVM.

Dans la deuxième partie, nous avons vus comment optimiser l’interface utilisateur avec le VirtualizingStackPanel, le multi Thread, les animations d’attente WPF. Nous avons eu également un aperçu de la manipulation des images pour utiliser lorsqu’elles existent les informations EXIF ou encore une transformation classique de ces images.

Je vous propose de voir dans cette troisième partie :

  • La mise en cache des images (améliorons l’interface utilisateur encore un petit peu)
  • Le Drag and Drop avec une sélection multiple d’éléments

Optimisation avec mise en cache

Implémentation d’un système de cache

Le but est de garder les x dernières images déjà chargée afin d’éviter un rechargement permanent de ces images.

Pour cela nous mettons en place une liste partagée en appel static, ainsi que son verrou (nous sommes dans un environnement multi-thread) afin de garantir l’écriture correcte des données.

const int maxThumbnailInCache = 300;
private static readonly List<ImageFileViewModel> _cacheThumbnail 
= new List<ImageFileViewModel>();
private static readonly object _lockCacheThumbnail = new object();

Puis nous implémentons la méthode static AddThumbnailInCache

 

 private static void AddThumbnailInCache(ImageFileViewModel p)
{
  if (p == null) return;
  if (_cacheThumbnail.Contains(p))
  {
      lock (_lockCacheThumbnail)
      {
          _cacheThumbnail.Remove(p);
      }
  }

  lock (_lockCacheThumbnail)
  {
      _cacheThumbnail.Add(p);
      if (_cacheThumbnail.Count > maxThumbnailInCache)
          lock (_lockCacheThumbnail)
          {
              _cacheThumbnail.Remove(_cacheThumbnail[0]);
          }
  }
}

La méthode teste si l’élément est présent. Si il est présent, l’élément est replacé à la fin de la liste.

Si le nombre d’éléments dépasse le maximum d’élément fixés dans le cache (maxThumbnailInCache), l’élément en haut (le plus ancien) est supprimé. Poursuivre la lecture