web-dev-qa-db-de.com

Wie zeigen Sie animierte GIFs in einem Windows Form (C #) an

Ich habe ein Formular mit Fortschrittsmeldungen, wenn ein ziemlich langer Prozess ausgeführt wird. Es ist ein Aufruf an einen Webservice, daher kann ich auf einer Fortschrittsleiste nicht wirklich einen prozentualen vollständigen Wert anzeigen. (Ich mag die Marquee-Eigenschaft der Fortschrittsleiste nicht besonders.)

Ich möchte ein animiertes GIF anzeigen, um dem Prozess das Gefühl einer bestimmten Aktivität zu vermitteln (z. B. Dateien, die von einem Computer zu einem anderen fließen, z. B. Windows-Kopiervorgang).

Wie machst Du das?

132
Stuart Helwig

Es ist nicht zu schwer.

  1. Legen Sie eine Bildbox auf Ihr Formular.
  2. Fügen Sie die GIF-Datei als Bild in die Bildbox ein
  3. Zeigen Sie die Bildbox beim Laden an.

Zu berücksichtigende Punkte:

  • Durch Deaktivieren der Bildbox wird verhindert, dass das GIF animiert wird.

Animierte Gifs:

Wenn Sie nach animierten Gifs suchen, können Sie diese generieren hier

Eine andere Möglichkeit:

Ein anderer Weg, den ich gefunden habe, der recht gut funktioniert, ist das asynchrone Dialog-Steuerelement, das ich im Code-Projekt gefunden habe

233
FryHard

Ich hatte das gleiche Problem. Vollständige Form (einschließlich GIF), die sich wegen längerer Arbeit im Hintergrund nicht mehr neu zeichnet. So habe ich das gelöst.

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

Ich habe einfach einen anderen Thread erstellt, um für diese Operation verantwortlich zu sein. Dank dieser ursprünglichen Form wird ohne Probleme neu gezeichnet (einschließlich meiner GIF-Arbeit). ShowProgressGifDelegate und HideProgressGifDelegate sind Delegaten im Formular, die die visible -Eigenschaft von pictureBox mit gif auf true/false setzen.

11
Aruch

Beachten Sie, dass Sie in Windows normalerweise keine animierten GIFs verwenden, sondern nur wenige AVI-Animationen: Es gibt ein natives Windows-Steuerelement, nur um sie anzuzeigen. Es gibt sogar Werkzeuge, um animierte Gifs in AVI (und umgekehrt) zu konvertieren.

6
PhiLho

Wenn Sie es in einem PictureBox-Steuerelement ablegen, sollte es einfach funktionieren

3
Grank

Es geht nicht, wenn Sie eine lange Operation hinter sich lassen, denn alles STOPS seit Sie im selben Thread sind.

1
Marc

Ich hatte das gleiche Problem und bin durch die Implementierung auf verschiedene Lösungen gestoßen, mit denen ich verschiedene Probleme hatte. Zum Schluss habe ich einige Stücke aus verschiedenen Positionen zusammengestellt, die für mich wie erwartet funktionierten.

private void btnCompare_Click(object sender, EventArgs e)
{
    ThreadStart threadStart = new ThreadStart(Execution);
    Thread thread = new Thread(threadStart);
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
}

Hier ist die Execution-Methode, mit der auch das PictureBox-Steuerelement aufgerufen wird:

private void Execution()
{
    btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = true; });
    Application.DoEvents();

    // Your main code comes here . . .

    btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = false; });
}

Denken Sie daran, dass die PictureBox im Eigenschaftenfenster nicht sichtbar ist oder tun Sie dies unten:

private void ComparerForm_Load(object sender, EventArgs e)
{
    pictureBox1.Visible = false;
}
0
M. Fawad Surosh