J'essaie de créer un type de contrôle qui affichera un grand nombre de vignettes, comme celle utilisée par Picasa.Remplir un FlowLayoutPanel avec un grand nombre de contrôles et peindre des miniatures à la demande
Ceci est ma conception:
J'ai un FlowLayoutPanel
qui est rempli avec beaucoup de UserControl
objets, par exemple 4000. Chaque délégué UserControl
reçoit un délégué pour l'événement Paint
. Lorsque l'événement Paint
est appelé, il vérifie un cache mémoire pour la vignette et si l'image n'est pas dans le cache, il l'extrait du disque.
J'ai deux problèmes que je suis en train de résoudre:
Il semble que WinForms déclenchera un événement
Paint
même si leUserControl
n'est pas en vue. Seulement une dizaine de contrôles sont en fait visibles, le reste ne l'est pas (leFlowLayoutPanel.AutoScroll
est défini surtrue
). En conséquence, il essaie de récupérer des vignettes pour toutes les images et cela prend beaucoup de temps. Ajouter les objetsUserControl
auFlowLayoutPanel
prend un peu de temps, environ 2-3 secondes. Je peux vivre avec elle, mais je me demande s'il y a une meilleure façon de le faire que:UserControl[] boxes = new UserControl[N]; // populate array panel.SuspendLayout(); panel.Controls.AddRange(boxes); panel.ResumeLayout();
Avoir le même problème. Je travaille avec des "contrats" qui peuvent avoir x lignes (x contrôles dans le fl-panel) et je vois aussi le temps long pour remplir le panneau avec toutes les commandes. 2-3 secondes pour 200 articles (pas même 4000 comme dans votre cas). Ill "fav" cette question à coup sûr. ;) – Stefan
Im allso utilisant suspendlayout/resumelayout et visible vrai/faux lors du remplissage des objets. – Stefan