Question

  1. Je souhaite créer une liste déroulante d'images extraites d'Internet et permettre à l'utilisateur de cliquer dessus. Comment puis-je le faire dans WinForms / C #? Est-il possible d’ajouter des contrôles picturebox à la liste de sélection?

  2. J'ai essayé d'ajouter une liste de PictureBox dans UserControl avec AutoScroll défini sur true, ce qui me donnerait l'impression d'utiliser une liste déroulante. Est-ce une bonne approche?

  3. J'ai également essayé de définir ImageLocation de pictureBox sur un URI de l'image, puis appelé Load () pour charger l'image. Cela a fonctionné, mais mon formulaire est gelé! Comment puis-je mettre à jour chaque image de manière séquentielle sans geler mon formulaire?

Merci Azlam

Était-ce utile?

La solution

Je vais d'abord répondre à votre troisième question, car c'est le seul auquel je connaisse VRAIMENT la réponse. Il existe une méthode LoadAsync () sur la zone d'image qui charge l'image dans un fil séparé et ne bloque pas votre application.

En ce qui concerne les autres questions, je commencerais probablement aussi par un contrôle utilisateur et y placerais les images. La seule chose que je puisse suggérer serait de créer d’abord un contrôle utilisateur avec une zone d’image, et peut-être une zone de texte multiligne ou une zone de texte riche à côté. Désactivez la bordure dans la zone de texte et laissez une légère bordure autour du contrôle entier. Cela vous permettra d'afficher l'image, avec du texte à côté. Ensuite, votre contrôle final réel sera simplement une collection de ces contrôles avec la possibilité de les ajouter si nécessaire.

- mes 2 cents ...

Autres conseils

Cela vous dérange-t-il de faire défiler verticalement?

Je commencerais par le contrôle DataGridView en tant que base et créerais l'implémentation suivante:

1) Créez une colonne et un type de cellule personnalisés à partir de DataGridViewImageColumn. Vous pouvez les appeler "CronosNetImageColumn", "CronosNetImageCell".

2) Créez une classe " CronosImageDetails " contenir les données de la cellule (inclure les propriétés pour le texte d'affichage et l'URL de l'image). Ceci sera transmis comme valeur pour chaque cellule. Ex:

ImageGrid.Rows.Add (nouveau CronosImageDetails {DisplayText = "Jour à la plage", ImageURL = "http: //...beach.jpg"});

3) Remplacez la cellule Paint () pour utiliser un WebClient afin d'obtenir l'image et utilisez e.Graphics.DrawImage (ImageObtainedFromWebClient) pour peindre l'image dans la cellule. Vous pouvez utiliser e.Graphics.DrawString ((CronosImageDetails) value.DisplayText, ...) pour superposer le texte dans la cellule.

Cette solution rapide vous fournirait une liste d'images défilante qui ne chargerait que des images lorsque l'utilisateur ferait défiler la liste et fournirait une base solide d'amélioration.

Optimisations supplémentaires recommandées:

A) Créez un bitmap et des graphiques de mémoire tampon pour le dessin des données de cellules.

B) Configurez Paint () pour simplement peindre le tampon de cache au lieu de faire le travail pour obtenir l'image

C) Créez une nouvelle méthode de cellule, LoadImage (), qui génère un nouveau thread qui télécharge l'image et la peint dans la mémoire tampon arrière.

D) Laissez Paint () (ou un thread d'assistance distinct) suivre la direction et l'accélération du défilement et estimer les cellules qui doivent être préchargées. Déclenchez LoadImage () sur ces cellules.

E) Initialiser le tampon de retour de chaque cellule avec une image de chargement.

F) Suivez et utilisez les données empiriques des temps de chargement des images pour déterminer les cellules à précharger.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top