如何在长时间异步操作期间显示动画gif?

时间:2009-12-18 20:51:43

标签: c# winforms animated-gif

我在C#中有一个Winforms应用程序,它调用异步调用方法并使用回调。 我想显示一个动画gif,让最终用户知道正在完成的工作。 我希望将动画gif悬停在表单的中心上。

我该怎么做?

更新: 谢谢。我想我缺少的一步是使用一个图片框来保持gif。 以下似乎是在做显示gif的技巧,就像下面说的jmatthews3865我可以将PictureBox的visible属性设置为false来隐藏它。

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

4 个答案:

答案 0 :(得分:2)

需要一些代码才能给出确切的答案,但这非常简单,在进行异步调用之前插入gif,然后在回调中删除它。

答案 1 :(得分:2)

在表单中

,只需将图像的可见属性设置为false即可。

从调用长时间运行的异步进程(button1_click等)的事件中,将images visibility属性设置为true。事件触发,图像出现,异步进程运行,你的ui线程应该仍然响应。

在回调事件中

将images visible属性设置为false,表示该过程已完成。

答案 2 :(得分:1)

这就是答案。我正在使用LoadingCircle,这是一个动画gif组件。

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

答案 3 :(得分:0)

我稍微修改了上面的代码并且它不会抛出错误“在创建窗口句柄之前,无法在控件上调用c#invoke或begininvoke。”

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

    }

}