2009-12-18 5 views
1

У меня есть приложение Winforms на C#, которое вызывает вызовы методом асинхронно и использует обратный вызов. Я хотел бы показать анимированный gif, чтобы конечный пользователь знал, что работа выполняется. Я бы хотел, чтобы анимационный gif зависал над центром формы.Как отображать анимированный gif при длительной асинхронной работе?

Как я могу это сделать?

Обновление: Спасибо. Я предполагаю, что шаг, который мне не хватало, - использовать Picture Box для хранения 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.

Из события, которое вызывает длительный процесс async (button1_click и т. Д.), Установите для свойства видимости изображений значение true. события, появляется изображение, выполняется процесс асинхронности, и ваш поток ui должен реагировать.

В вашем событии обратного вызова установлено, что видимое свойство images равно 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# 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); 
     } 

    } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^