Pregunta

  1. Quiero crear una lista desplazable de imágenes obtenidas de Internet y darle al usuario la posibilidad de hacer clic en ellas. ¿Cómo hago para hacerlo en WinForms / C #? ¿Es posible agregar controles / controles de picturebox a listBox?

  2. Intenté agregar una lista de picturebox en UserControl con AutoScroll establecido en true, lo que me dará la sensación de usar listBox. ¿Es este un enfoque correcto?

  3. También intenté configurar ImageLocation de pictureBox en un URI de la imagen y luego llamé a Load () para cargar la imagen, funcionó, ¡pero mi formulario se está congelando! ¿Cómo sigo actualizando cada cuadro de imagen de forma secuencial sin congelar mi formulario?

Gracias Azlam

¿Fue útil?

Solución

Primero responderé tu tercera pregunta, porque esa es la única a la que REALMENTE conozco la respuesta. Hay un método LoadAsync () en el cuadro de imagen que cargará la imagen en un hilo separado y no bloqueará su aplicación.

En cuanto a las otras preguntas, lo más probable es que yo también comience con un control de usuario y coloque las imágenes allí. Lo único que puedo sugerir sería crear primero un control de usuario que tenga un cuadro de imagen, y tal vez un cuadro de texto multilínea o cuadro de texto enriquecido al lado. Apague el borde en el cuadro de texto y tenga un borde ligero alrededor de todo el control. Esto le permitirá mostrar la imagen, con algo de texto al lado. Luego, su control final real será una colección de estos controles con la capacidad de agregarlos según sea necesario.

--mi 2 centavos ...

Otros consejos

¿Te importa desplazarte verticalmente?

Comenzaría con el control DataGridView como base y crearía la siguiente implementación:

1) Cree columnas y tipos de celdas personalizados derivados de DataGridViewImageColumn. Podrías llamarlos "CronosNetImageColumn", "CronosNetImageCell".

2) Crear una clase " CronosImageDetails " para mantener los datos de la celda (incluye propiedades para mostrar el texto y la url de la imagen). Esto se pasará como el valor de cada celda. Ej:

ImageGrid.Rows.Add (new CronosImageDetails {DisplayText = " Day at the Beach " ;, ImageURL = " http: //...beach.jpg"});

3) Anule la pintura de celda () para usar un WebClient para obtener la imagen y use e.Graphics.DrawImage (ImageObtainedFromWebClient) para pintar la imagen en la celda. Puede usar e.Graphics.DrawString ((CronosImageDetails) value.DisplayText, ...) para superponer el texto en la celda.

Esta solución rápida le proporcionaría una lista de imágenes desplazables que solo carga imágenes a medida que el usuario se desplaza por la lista y proporciona una base sólida para mejorar.

Otras optimizaciones recomendadas:

A) Cree un mapa de bits de backbuffer y gráficos para dibujar datos de celda.

B) Configure Paint () para simplemente pintar el backbuffer en lugar de hacer el trabajo para obtener la imagen

C) Cree un nuevo método de celda LoadImage () que genera un nuevo hilo que descarga la imagen y la pinta en el búfer posterior.

D) Haga que Paint () (o un hilo auxiliar separado) rastree la dirección y la aceleración del desplazamiento y calcule qué celdas deben precargarse. Desencadenar LoadImage () en esas celdas.

E) Inicialice el búfer posterior de cada celda con una imagen de carga.

F) Rastree y use datos empíricos de los tiempos de carga de imágenes para ayudar a determinar qué celdas deben precargarse.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top