Bonjour à toutes et tous,
J'utilise un listview pour afficher des images. Ces images sont calculées par un backgroundworker et doit mettre à jour les images des items du listview. Pour ce faire, j'effectue lmes étapes suivantes :
1. Passage du dossier à traiter
2. Récupération des fichiers à traiter et affichage des listviewitems avec une image par défaut
3. Lancement des calculs en arrière plans.
4. Mise à jour ou ajout des miniatures dans le imagelist et lien dans l'item correspondant : PROBLEME
Le point 4 ne fait pas d'erreur mais l'image de l'items est bien supprimée mais la nouvelle image n'est pas prise en compte dans le listview.
Des test effectué par la selection d'un item me confirme le bon lien de image dans l'imagelist et la bonne image.
Comment faire pour que les images soient visible pour l'item après ajout dans l'imagelist?
Voici le code utilisé :
La partie test qui fonctionne parfaitement bien et démontre que les images sont bien présentent et liées
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150 internal class ListViewThumbnails : ListView { DirectoryInfo _dir = default!; bool _showDir = true; DirectoryInfo[] _dossiers = Array.Empty<DirectoryInfo>(); FileInfo[] _files = Array.Empty<FileInfo>(); ImageList _imageList = new(); public DirectoryInfo Directory { get { return _dir; } set { _dir = value; AsyncPopulate(); } } public bool ShowDir { get => _showDir; set { _showDir = value; AsyncPopulate(); } } public bool ShowCachedFile { get; set; } = false; public ListViewThumbnails() { DoubleBuffered = true; _imageList.ColorDepth = ColorDepth.Depth32Bit; View = View.LargeIcon; CreateImageListBase(); LargeImageList = _imageList; } protected void CreateImageListBase() { ImageList ilt = new() { ImageSize = new Size(256, 256) }; ilt.Images.Add("File", Properties.ResourcesMain.File); ilt.Images.Add("Directory", Properties.ResourcesMain.Dir); ilt.Images.Add("Error", Properties.ResourcesMain.Error); _imageList = ilt; } protected async void AsyncPopulate() { CreateImageListBase(); Items.Clear(); if (Directory == null || !System.IO.Directory.Exists(Directory.FullName)) return; ListViewItem[] directoryItems = await AsyncLoadDirectories(); ListViewItem[] filesItems = await AsyncLoadFiles(); BeginUpdate(); if (ShowDir) Items.AddRange(directoryItems); Items.AddRange(filesItems); EndUpdate(); CreatePreview(_files); } private async Task<ListViewItem[]> AsyncLoadDirectories() { return await Task.Run(() => { _dossiers = Directory.GetDirectories().OrderBy(x => x.Name).ToArray(); List<ListViewItem> dossiersItems = new List<ListViewItem>(); foreach (var dossierPath in _dossiers) { dossiersItems.Add( new ListViewItem(Path.GetFileName(dossierPath.Name)) { ImageKey = "Directory", Tag = dossierPath }); } return dossiersItems.ToArray(); }); } private async Task<ListViewItem[]> AsyncLoadFiles() { return await Task.Run(() => { var filesList = new List<ListViewItem>(); _files = Directory.GetFiles(); if (!ShowCachedFile) _files = _files.Where(x => x.Attributes != FileAttributes.Hidden).ToArray(); _files = _files.OrderBy(x => x.Name).ToArray(); foreach (var file in _files) { filesList.Add(new ListViewItem(Path.GetFileName(file.Name)) { ImageKey = "File", Tag = file }); } return filesList.ToArray(); }); } #region LoadPreview private void CreatePreview(FileInfo[] files) { PreviewCreator cr = new(); cr.Preview += (sender, e) => //Mise à jour des listviewitem après chaque chargement des aperçus { int index = _imageList.Images.IndexOfKey(e.FileName); if (index < 0) { _imageList.Images.Add(e.FileName, e.Preview); var item = FindItemWithText(e.FileName); if (item != null) item.ImageKey = e.FileName; } else _imageList.Images[index] = e.Preview; Invalidate(); }; cr.Completed += (sender, e) => {}; cr.AsyncGetPreview(files); //backgroundworker pour la creation des miniatures } #endregion }
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 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { string key = comboBox1.SelectedItem.ToString(); pictureBox1.Image = listViewExtend1.images.Images[listViewExtend1.images.Images.IndexOfKey(key)]; } private void listViewExtend1_SelectedIndexChanged(object sender, EventArgs e) { if (listViewExtend1.SelectedItems == null || listViewExtend1.SelectedItems.Count == 0) return; ListViewItem lvi = listViewExtend1.SelectedItems[0]; string key = lvi.ImageKey; pictureBox2.Image = listViewExtend1.images.Images[listViewExtend1.images.Images.IndexOfKey(key)]; } private void listViewExtend1_test(object sender, EventArgs e) { comboBox1.Items.Clear(); for (int i = 0; i < listViewExtend1.images.Images.Count; i++) { comboBox1.Items.Add(listViewExtend1.images.Images.Keys[i]); } }
Partager