【问题标题】:How to display animated gif during long asynchronous operation?长时间异步操作时如何显示动画gif?
【发布时间】:2010-12-28 04:29:45
【问题描述】:

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

我该怎么做?

更新: 谢谢。我想我缺少的步骤是使用图片框来保存 gif。 以下似乎是在做显示 gif 的技巧,就像下面的 jmatthews3865 所说的,我可以将 PictureBox 的可见属性设置为 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;
}

【问题讨论】:

    标签: c# winforms animated-gif


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        这就是答案。我正在使用 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); 
            } 
           }
        

        【讨论】:

          【解决方案4】:

          我稍微修改了上面的代码,它不会抛出错误“在创建窗口句柄之前,不能在控件上调用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);
                  }
          
              }
          
          }
          

          【讨论】:

            猜你喜欢
            • 2016-08-23
            • 1970-01-01
            • 2013-02-07
            • 1970-01-01
            • 1970-01-01
            • 2023-03-27
            • 1970-01-01
            相关资源
            最近更新 更多