Cómo mostrar GIFS animados en un formulario de Windows (c#)


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

Me gustaría mostrar un GIF animado para dar al proceso la sensación de alguna actividad (por ejemplo, archivos volando de un equipo a otro como el proceso de copia de Windows).

¿Cómo se hace esto?

Author: Andy Lester, 2008-10-03

6 answers

No es demasiado difícil.

  1. Coloca un picturebox en tu formulario.
  2. Añadir el.archivo gif como la imagen en el picturebox
  3. Muestra el picturebox cuando estás cargando.

Cosas a tener en cuenta:

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

Gif animados:

Si estás buscando gifs animados puedes generarlos aquí

Otra forma de hacerlo:

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

 225
Author: FryHard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-04 21:19:37

Yo tenía el mismo problema. Toda la forma (incluyendo gif) se detiene para redibujarse debido a la larga operación que funciona en segundo plano. Así es como 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 continúa redibujando sin problemas (incluyendo mi gif de trabajo). ShowProgressGifDelegate y HideProgressGifDelegate son delegados en forma que establecen la propiedad visible de PictureBox con gif en true / false.

 11
Author: Aruch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-19 14:48:40

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

 6
Author: PhiLho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-03 05:16:41

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

 3
Author: Grank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-03 04:58:17

No lo hace cuando se inicia una operación larga detrás, porque todo SE DETIENE ya que estás en el mismo hilo.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-17 13:57:12

Tuve el mismo problema y encontré diferentes soluciones mediante la implementación que solía enfrentar varios problemas diferentes. Por último, a continuación se muestra lo que puse algunas piezas de diferentes puestos juntos que funcionó 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 la invocación del 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;
}
 0
Author: M. Fawad Surosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-08 01:06:59