Bonjour,

J'essaye en ce moment de développez une application qui liste les fichiers d'un dossiers (ainsi que ses sous-dossiers).
Mon problème est que je souhaiterais avoir plusieurs threads et qu'ils communiquent entre eux.

  • Le timer doit commencer à partir du moment ou l'utilisateur clique sur le bouton Afficher et s'incrémenter(avec l'affichage en direct) jusqu'à ce que tous les fichiers soit affichés
  • La progress bar doit se mettre à jour en temps réel sachant que l'on connait le nombre de fichiers à afficher (1 barre/total fichiers)
  • Sur la progressbar j'ai un textblock qui affiche le cours des opération
  • Les fichiers sont chargés sans bloquer l'UI
  • J'ai aussi un filtre sur les fichiers ce qui explique pourquoi j'utilise un CollectionViewSource


Voici mon UI sous paint dsl^^ :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
private IEnumerable<FileInfo> files = null;
private ObservableCollection<FileInformationsViewModel> _filesCollection;
 
public CollectionViewSource FilesCollection { get; set; }
 
public ICollectionView FilterFilesCollection
{
	get { return FilesCollection.View; }
}
 
public MainView()
{
	this._filesCollection = new ObservableCollection<FileInformationsViewModel>();
 
	FilesCollection = new CollectionViewSource();
	FilesCollection.Source = this._filesCollection;
 
	InitializeComponent();
}
 
private void browseFolderSource_Click(object sender, RoutedEventArgs e)
{
	string directoryChosen = ShowFolderBrowserDialog();
	if (!String.IsNullOrEmpty(directoryChosen))
	{
		pathSourceSelected.Text = directoryChosen;
		DirectoryInfo topDirectory = new DirectoryInfo(directoryChosen);
		files = enumerateFileInDirectory(topDirectory);
	}
}
 
private IEnumerable<FileInfo> enumerateFileInDirectory(DirectoryInfo directory)
{
	IEnumerable<FileInfo> result = null;
	try
	{
		result = directory.EnumerateFiles("*", SearchOption.AllDirectories);
	}
	catch (DirectoryNotFoundException DirNotFound)
	{
		Console.WriteLine("{0}", DirNotFound.Message);
	}
	catch (UnauthorizedAccessException UnAuthDir)
	{
		Console.WriteLine("UnAuthDir: {0}", UnAuthDir.Message);
	}
	catch (PathTooLongException LongPath)
	{
		Console.WriteLine("{0}", LongPath.Message);
	}
	return result;
}
 
private void buttonDisplay_Click(object sender, RoutedEventArgs e)
{
	if (files != null)
	{
		var fileVM =
                from c in files
                select new FileInformationsViewModel(c, Brushes.LightBlue);
 
		foreach (var item in fileVM.OrderBy(x => x.Name).ThenBy(x => x.Length))
		{
			TextBlockInformation.Text = String.Format("Ajout ", item.Name);
			this._filesLeftCollection.Add(item);
		}
 
		TextBlockInformation.Text = "Prêt";
	}
}
Je ne maitrise pas le MVVM avec les Commands, mais je comprends (je pense) le concept des viewmodels
J'ai essayer d'utiliser un UpdateProgressBarDelegate pour la progressbar et un DispatcherTimer pour mon timer mais rien n'y fait je ne sais pas où les instancier et à quel niveau les déclarer.

Au niveau des recherche je suis sur ces threads mais je n'arrive pas à les adapter à mon problème
http://www.developpez.net/forums/d79...ltithread-wpf/

http://msdn.microsoft.com/fr-fr/vstudio/cc895446.aspx

http://www.codeproject.com/Articles/...onization-in-C

Toutes aide est la bienvenue