etoisarobot
etoisarobot

Reputation: 7794

How to display animated gif during long asynchronous operation?

I have a Winforms app in C# that calls calls a method asynchronously and uses a callback. I would like to display an animated gif to let the end user know that work is being done. I would like to have the animated gif hover over the center of the form.

How can I do this?

Update: Thanks. I guess the step I was missing was to use a Picture Box to hold the gif. The following seems to be doing the trick of showing the gif and like jmatthews3865 said below I can just set the visible property of the PictureBox to false to hide it.

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;
}

Upvotes: 1

Views: 6711

Answers (4)

Mou
Mou

Reputation: 16282

i modify the above code a bit and it will not throw error "c# invoke or begininvoke cannot be called on a control until the window handle has been created."

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);
        }

    }

}

Upvotes: 0

djole351
djole351

Reputation: 11

This is the answer. I'm using LoadingCircle which is an animated gif component.

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); 
    } 
   }

Upvotes: 1

user10635
user10635

Reputation: 702

in your form, simply include the image with it's visible property set to false.

from the event which calls the long running async process (button1_click etc.), set the images visibility property to true. event fires, image appears, async process runs and your ui thread should still be responsive.

in your callback event set the images visible property to false to indicate that the process is complete.

Upvotes: 2

Paul Creasey
Paul Creasey

Reputation: 28824

Need some code to give an exact answer, but this is fairly trivial, insert the gif before you make the asynchronous call, then remove it in the callback.

Upvotes: 2

Related Questions