1

我在 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

4 回答 4

2

需要一些代码来给出确切的答案,但这相当简单,在进行异步调用之前插入 gif,然后在回调中将其删除。

于 2009-12-18T20:53:58.920 回答
2

在您的表单中,只需将图像的可见属性设置为 false 即可。

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

在您的回调事件中,将 images visible 属性设置为 false 以指示该过程已完成。

于 2009-12-18T21:01:50.510 回答
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); 
    } 
   }
于 2014-02-04T15:06:22.803 回答
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);
        }

    }

}
于 2015-04-07T11:06:45.257 回答