Pregunta

Tengo un formulario que muestra los mensajes de progreso mientras se ejecuta un proceso bastante largo. Es una llamada a un servicio web, por lo que realmente no puedo mostrar un porcentaje completo en una barra de progreso de manera significativa. (No me gusta particularmente la propiedad Marquee de la barra de progreso)

Me gustaría mostrar un GIF animado para darle al proceso la sensación de cierta actividad (por ejemplo, archivos que vuelan de una computadora a otra como el proceso de copia de Windows).

¿Cómo haces esto?

¿Fue útil?

Solución

No es demasiado difícil.

  1. Coloque una picturebox en su formulario.
  2. Agregue el archivo .gif como la imagen en la picturebox
  3. Muestra la picturebox cuando estés cargando.

Cosas a tener en cuenta:

  • Deshabilitar el picturebox evitará que el gif sea animado.

Gifs animados:

Si estás buscando gifs animados, puedes generarlos aquí

Otra forma de hacerlo:

Otra forma en que he encontrado que funciona bastante bien es el control de diálogo asíncrono que encontré en proyecto de código

Otros consejos

Tuve el mismo problema. La forma completa (incluido el gif) se detiene para redibujarse debido a una operación larga que trabaja en segundo plano. Aquí es cómo resolví esto.

  private void MyThreadRoutine()
  {
   this.Invoke(this.ShowProgressGifDelegate);
   //your long running process
   System.Threading.Thread.Sleep(5000);
   this.Invoke(this.HideProgressGifDelegate);
  }

  private void button1_Click(object sender, EventArgs e)
  {
   ThreadStart myThreadStart = new ThreadStart(MyThreadRoutine);
   Thread myThread = new Thread(myThreadStart);
   myThread.Start(); 
  }

Simplemente creé otro hilo para ser responsable de esta operación. Gracias a esta forma inicial, se continúa redibujando sin problemas (incluido mi gif en funcionamiento). ShowProgressGifDelegate y HideProgressGifDelegate son delegados en forma que establecen la propiedad visible de pictureBox con gif en true / false.

Tenga en cuenta que en Windows, tradicionalmente no usa Gifs animados, sino pequeñas animaciones AVI: hay un control nativo de Windows solo para mostrarlas. Incluso hay herramientas para convertir Gifs animados a AVI (y viceversa).

Si lo pones en un control PictureBox, debería funcionar

No cuando empiezas una operación larga por detrás, porque todo SE PARE desde que estás en el mismo hilo.

Tuve el mismo problema y encontré diferentes soluciones al implementar que solía enfrentar varios problemas diferentes. Finalmente, a continuación es lo que puse algunas piezas de diferentes publicaciones que funcionaron para mí como se esperaba.

private void btnCompare_Click(object sender, EventArgs e)
{
    ThreadStart threadStart = new ThreadStart(Execution);
    Thread thread = new Thread(threadStart);
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
}

Aquí está el método de ejecución que también lleva invocar el control PictureBox:

private void Execution()
{
    btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = true; });
    Application.DoEvents();

    // Your main code comes here . . .

    btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = false; });
}

Tenga en cuenta que el PictureBox es invisible desde la ventana de Propiedades o haga lo siguiente:

private void ComparerForm_Load(object sender, EventArgs e)
{
    pictureBox1.Visible = false;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top