Pregunta

Tengo una aplicación Windows Forms en C # que llama llama a un método de forma asíncrona y utiliza una devolución de llamada. Me gustaría mostrar un gif animado para que el usuario final saber que se está trabajando. Me gustaría tener el cursor del gif animado sobre el centro de la forma.

¿Cómo puedo hacer esto?

Actualización: Gracias. Supongo que el paso que faltaba era utilizar un cuadro de imagen para mantener el gif. El siguiente parece estar haciendo el truco de mostrar el gif y como jmatthews3865 dijo a continuación que sólo puede establecer la propiedad visible del cuadro de imagen a falso para ocultarlo.

private ShowAnimatedGif()
{
 PictureBox pb = new PictureBox();
 this.Controls.Add(pb);
 pb.Left = (this.Width / 2) - (pb.Width / 2);
 pb.Top = (this.Height / 2) - (pb.Height / 2);
 pb.Image = Resources.AnimatedGifHere;
 pb.Visible = true;
}
¿Fue útil?

Solución

en su forma, basta con incluir la imagen con su propiedad visible establecida en false.

en el caso de que llama al proceso de larga ejecución asíncrono (Button1_Click etc.), establecer la propiedad imágenes visibilidad a la verdadera. desencadena el evento, la imagen aparece, se ejecuta el proceso asíncrono y el hilo de interfaz de usuario aún debe ser sensible.

en su caso de devolución de llamada establezca las imágenes propiedad visible en false para indicar que el proceso se haya completado.

Otros consejos

¿Necesita algo de código para dar una respuesta exacta, pero esto es bastante trivial, inserte el gif antes de hacer la llamada asincrónica, posteriormente retirarlo de la devolución de llamada.

Esta es la respuesta. Estoy usando LoadingCircle que es un componente gif animado.

public partial class Form1 : Form
{
   public delegate void ProcessAnimation(bool show);
   ProcessAnimation pa;

   public Form1()
    {
        InitializeComponent();

        pa = this.ShowAnimation;
    }    

private void button2_Click(object sender, EventArgs e)
    {

        Thread tr = new Thread(FlushToServer);
        tr.Start();

    }

    private void ShowAnimation(bool show)
    {
        if (show)
        {
            loadingCircle1.Visible = true;
            loadingCircle2.Active = true;

        }
        else
        {
            loadingCircle1.Visible = false;
            loadingCircle1.Active = false;

        }
    }




    private void FlushToServer()
    {

        this.Invoke(this.pa,true);
        //your long running process
        System.Threading.Thread.Sleep(5000);
        this.Invoke(this.pa,false); 
    } 
   }

Puedo modificar el código de arriba un poco y no va a tirar de error "c # invocar o BeginInvoke no puede ser llamado en un control hasta que el identificador de ventana ha sido creado."

namespace AnimateUI
{
    public partial class Form1 : Form
    {
        public delegate void ProcessAnimation(bool show);
        ProcessAnimation pa;


        public Form1()
        {
            InitializeComponent();
            pa = this.ShowAnimation;
            pictureBox1.Visible = false;
        }

        private void ShowAnimation(bool show)
        {
            if (show)
            {
                pictureBox1.Visible = true;
            }
            else
            {
                pictureBox1.Visible = false;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread tr = new Thread(StartTask);
            tr.Start();
        }

        private void StartTask()
        {
            if (!this.IsHandleCreated)
                this.CreateControl();

            this.Invoke(this.pa, true);
            System.Threading.Thread.Sleep(15000);
            this.Invoke(this.pa, false);
        }

    }

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