2009-12-18 4 views
1

J'ai une application Winforms en C# qui appelle les appels une méthode de façon asynchrone et utilise un rappel. Je voudrais afficher un gif animé pour faire savoir à l'utilisateur final que le travail est en cours. Je voudrais avoir le GIF animé au dessus du centre du formulaire.Comment afficher gif animé pendant une opération asynchrone longue?

Comment est-ce que je peux faire ceci?

Mise à jour: Merci. Je suppose que le pas qui me manquait était d'utiliser une Picture Box pour tenir le gif. Ce qui suit semble faire l'affaire d'afficher le gif et comme jmatthews3865 dit ci-dessous, je peux simplement définir la propriété visible de la PictureBox à faux pour le cacher.

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

Répondre

2

Dans votre formulaire, insérez simplement l'image avec sa propriété visible définie sur false.

de l'événement qui appelle le processus asynchrone long (bouton1_click, etc.), définissez la propriété de visibilité des images sur true. les événements se déclenchent, l'image apparaît, le processus async s'exécute et votre thread ui doit toujours être réactif.

Dans votre événement de rappel, définissez la propriété visible sur false pour indiquer que le processus est terminé.

2

besoin du code pour donner une réponse exacte, mais cela est assez trivial, insérez le gif avant de faire l'appel asynchrone, puis retirez-le dans le rappel.

1

Voici la réponse. J'utilise LoadingCircle qui est un composant gif animé.

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

i modifier le code ci-dessus un peu et il ne jetterai pas l'erreur « C# ou Invoke BeginInvoke ne peut pas être appelée sur un contrôle jusqu'à ce que la poignée de fenêtre a été créée. »

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

    } 

} 
Questions connexes