J'ai un formulaire indiquant les messages de progression lorsqu'un processus assez long est exécuté. Il s’agit d’un appel à un service Web et je ne peux donc pas afficher de manière significative un pourcentage complet sur une barre de progression. (Je n'aime pas particulièrement la propriété Marquee de la barre de progression)
Je souhaite afficher une image GIF animée pour donner au processus l’impression d’une activité (par exemple, des fichiers volants d’un ordinateur à un autre, comme le processus de copie Windows).
Comment est-ce que tu fais ça?
Ce n'est pas trop dur.
Points à prendre en compte:
Gifs animés:
Si vous recherchez des gifs animés, vous pouvez les générer ici
Une autre façon de le faire:
Une autre manière qui fonctionne très bien est le contrôle de dialogue asynchrone trouvé dans le projet code
J'ai eu le même problème. La forme entière (y compris gif) s'arrête pour se redessiner à cause d'une longue opération de travail en arrière-plan. Voici comment j'ai résolu ceci.
private void MyThreadRoutine()
{
this.Invoke(this.ShowProgressGifDelegate);
//your long running process
System.Threading.Thread.Sleep(5000);
this.Invoke(this.HideProgressGifDelegate);
}
private void button1_Click(object sender, EventArgs e)
{
ThreadStart myThreadStart = new ThreadStart(MyThreadRoutine);
Thread myThread = new Thread(myThreadStart);
myThread.Start();
}
J'ai simplement créé un autre thread pour être responsable de cette opération. Merci à cette forme initiale continue à redessiner sans problèmes (y compris mon gif de travail). ShowProgressGifDelegate et HideProgressGifDelegate sont des délégués sous forme qui définissent la propriété visible de pictureBox avec gif à true/false.
Notez que dans Windows, vous n'utilisez généralement pas de gifs animés, mais de petites animations AVI: il existe un contrôle natif Windows juste pour les afficher. Il existe même des outils pour convertir des gifs animés en AVI (et inversement).
Si vous le mettez dans un contrôle PictureBox, cela devrait fonctionner
Ce n'est pas le cas lorsque vous démarrez une longue opération, car tout s'arrête puisque vous êtes dans le même fil.
J'avais le même problème et je trouvais différentes solutions en mettant en œuvre des solutions qui me permettaient de faire face à différents problèmes. Enfin, vous trouverez ci-dessous quelques éléments de différents articles qui ont fonctionné comme prévu.
private void btnCompare_Click(object sender, EventArgs e)
{
ThreadStart threadStart = new ThreadStart(Execution);
Thread thread = new Thread(threadStart);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
Voici la méthode d'exécution qui appelle également le contrôle PictureBox:
private void Execution()
{
btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = true; });
Application.DoEvents();
// Your main code comes here . . .
btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = false; });
}
N'oubliez pas que la PictureBox est invisible à partir de la fenêtre Propriétés ou procédez comme suit:
private void ComparerForm_Load(object sender, EventArgs e)
{
pictureBox1.Visible = false;
}