2009-12-18 46 views
1

我有一個C#中的Winforms應用程序,該應用程序異步調用方法並使用回調函數。 我想顯示一個動畫gif讓最終用戶知道工作正在完成。 我想將動畫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; 
} 

回答

2

在您的表單中,只需將圖像的可見屬性設置爲false即可。

來自調用長時間運行異步進程的事件(button1_click等),將圖像可見性屬性設置爲true。事件觸發,圖像出現,異步過程運行,你的UI線程仍然是響應。

在您的回調事件中,將圖像可見屬性設置爲false以指示該過程已完成。

2

需要一些代碼來給出一個確切的答案,但是這是相當瑣碎,插入GIF您做出異步調用之前,然後將其刪除回調。

1

這就是答案。我正在使用LoadCircle,它是一個動畫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); 
    } 
    } 
0

我修改了上面的代碼一點,它不會拋出錯誤「C#調用或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); 
     } 

    } 

}