2008-11-25 6 views
0
  1. Je veux créer une liste déroulante de photos récupérées sur Internet et donner à l'utilisateur la possibilité de cliquer dessus. Comment puis-je le faire dans WinForms/C#? Est-il possible d'ajouter le contrôle/les contrôles de la boîte à images à la liste de contrôle?Récupérer des images à partir du réseau et les afficher séquentiellement

  2. J'ai essayé d'ajouter une liste de picturebox dans UserControl avec AutoScroll réglé sur true, ce qui me donnera l'impression d'utiliser un listBox, Est-ce une bonne approche?

  3. J'ai également essayé de définir l'ImageLocation de la PictureBox à 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

Répondre

1

Je vais répondre à votre troisième question d'abord, cela parce que c'est le seul que je connaisse vraiment la réponse. Il y a une méthode LoadAsync() sur la zone d'image qui va charger l'image dans un fil séparé et ne sera pas accrocher votre application. En ce qui concerne les autres questions, je commencerais très probablement avec un contrôle d'utilisateur et mettrais les images là-bas. La seule chose que je peux suggérer serait de créer d'abord un contrôle d'utilisateur qui a une boîte d'image, et peut-être une zone de texte multiligne ou une zone de texte riche à côté de lui. Désactivez la bordure dans la zone de texte et disposez d'une légère bordure autour de l'ensemble du contrôle. Cela vous permettra d'afficher l'image, avec du texte à côté. Ensuite, votre contrôle final actuel sera juste une collection de ces contrôles avec la possibilité de les ajouter au besoin.

--Mon 2 cents ...

+0

Merci, laissez-moi essayer la méthode loadAsync(), je fais exactement la façon dont vous avez mentionné – Azlam

+0

hey cette approche nécessite-t-elle le contrôle de base à placer dans une application comme MDI? Cela empêchera-t-il l'application de geler? – Azlam

0

mind Avez-vous défilement vertical?

Je commencerais par le contrôle DataGridView comme base et créer la mise en œuvre suivante:

1) Créer colonne personnalisée et provenant de DataGridViewImageColumn type de cellule. Vous pouvez les appeler "CronosNetImageColumn", "CronosNetImageCell".

2) Créer une classe "CronosImageDetails" pour contenir les données de la cellule (inclure les propriétés du texte d'affichage et de l'URL de l'image). Cela sera transmis en tant que valeur pour chaque cellule. Ex:

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

3) Remplacer la cellule Paint() pour utiliser un WebClient pour obtenir l'image et utiliser 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 permet d'obtenir une image défilante qui ne charge les images que lorsque l'utilisateur parcourt la liste et fournit une base solide pour l'amélioration.

autres optimisations recommandées:

a) créer une image bitmap et graphiques backbuffer pour l'élaboration des données de cellule.

B) Peinture d'installation() pour peindre simplement le backbuffer au lieu de faire le travail pour obtenir l'image

C) Créer une nouvelle méthode cellulaire LoadImage() qui engendre un nouveau thread qui télécharge l'image et il peint sur le tampon arrière. D) Avoir Paint() (ou un fil auxiliaire séparé) suivre la direction et l'accélération du défilement et estimer quelles cellules doivent être préchargées. Déclenchez LoadImage() sur ces cellules.

E) Initialiser le tampon arrière de chaque cellule avec une image de chargement. F) Suivre et utiliser des données empiriques à partir des temps de chargement des images pour aider à déterminer quelles cellules doivent être préchargées.

Questions connexes