Tout d'abord, deux nouveaux screenshots d'EasyMedia Manager, le Media Center que je développe en WPF. Au menu des réjouissances, la partie "visionnage" des vidéos, avec bien entendu un mode normal et un mode plein écran :

 

 

Pour ne pas faire un post "screenshots" je vais rapidement vous parler du chargement asynchrone d'une ListView.

Déjà, commençons par rappeler qu'une tâche asynchrone, contrairement à une tâche synchrone est une tâche qui se déroule sans que l'on attende sa terminaison pour continuer l'exécution du programme. L'intérêt est de ne pas "figer" l'interface graphique lors d'un traitement lourd, qui peut lui être exécuté dans un thread à part.

Et là, j'avoue encore avoir été bluffé par cette technologie qu'est WPF. Certes nous connaissions les pools de threads et autres "BackgroundWorker" en .NET 2, mais là, la tâche est encore plus simple !

Pour ce faire nous allons utiliser une instance de la classe Binding, qui va nous servir pour représenter la source de données à lier à notre ListView. Cette classe expose une propriété très intéressante : IsAsync. Ce simple booléen va tout simplement permettre d'indiquer si l'on souhaite que les propriétés de notre databinding soient récupérées de manière synchrone (par défaut) ou asynchrone. Aucun autre travail à faire de notre côté!

Voici la classe représentant la source de données :

namespace EasyMediaManager.Core.Classes

{

public class ItemViewSource

{

private List<ItemView> _source;

private string _Path;

public ItemViewSource(string _path)

{

_Path = _path;

}

public string Path

{

set { this._Path = value; }

get { return this._Path; }

}

public List<ItemView> Source

{

get

{

this._source = Utils.BrowseDirectory(this._Path);

return this._source;

}

set

{

this._source = value;

}

}

}

}

Rien de très compliqué : une liste d'item, et une propriété qui l'expose. On en profite pour stocker le chemin du dossier à explorer.

Voici maintenant un exemple de l'utilisation de la classe Binding décrite ci-dessus :

ItemViewSource source = new ItemViewSource(_CurrentPath);

Binding b = new Binding();

b.IsAsync = true;

b.Source = source;

b.Path = new PropertyPath("Source");

this.listview_Media.SetBinding(ListView.ItemsSourceProperty, b);

Tout d'abord, nous créeons une instance de la classe ItemViewSource, représentant notre source de données à proprement dite. Ensuite nous créeons une instance de la classe Binding. Nous précisons que nous souhaitons que la liaison se fasse de manière asynchrone. La source de la liaison est bien notre instance de ItemViewSource, sur sa propriété "Source".

Il ne reste plus qu'à effectuer la liaison à notre contrôle ListView par l'intermédiaire de la méthode SetBinding appelée sur celui-ci.

Et voilà, le tour est joué : tout le traitement réalisé sur l'appel de la propriété "Source" d'ItemViewSource (i.e. l'appel de la méthode Utils.BrowseDirectory) est exécuté dans un autre thread que celui de l'interface graphique. Ainsi, l'interface n'est pas figé lors de la récupération du contenu du répertoire !

A bientôt Wink

Au total, 0 commentaire(s) posté(s) ! Poster un commentaire

comments Ajouter un commentaire

(Affichera votre icône Gravatar)  
[b][/b] - [i][/i] - [u][/u]- [quote][/quote]