Come si visualizzano GIF animate su un Windows Form (c #)

Ho un modulo che mostra i messaggi di avanzamento mentre viene eseguito un processo piuttosto lungo. È una chiamata a un servizio Web, quindi non è ansible visualizzare in modo significativo una percentuale completa di una barra di avanzamento. (Non mi piace particolarmente la proprietà Marquee della barra di avanzamento)

Mi piacerebbe mostrare una GIF animata per dare al processo la sensazione di una certa attività (ad esempio file che volano da un computer all’altro come il processo di copia di Windows).

Come fai a fare questo?

Non è troppo difficile.

  1. Lascia una casella immagine sul modulo.
  2. Aggiungi il file .gif come immagine nella casella immagine
  3. Mostra la picturebox quando stai caricando.

Cose da prendere in considerazione:

  • Disabilitare la picturebox impedirà l’animazione della gif.

Gif animate:

Se stai cercando gif animate, puoi generarle qui

Un altro modo per farlo:

Un altro modo in cui ho trovato che funziona abbastanza bene è il controllo di dialogo asincrono che ho trovato nel progetto di codice

Ho avuto lo stesso problema. Forma intera (incluso gif) che si ferma per ridisegnarsi a causa della lunga operazione di lavoro in background. Ecco come ho risolto questo.

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

Ho semplicemente creato un altro thread per essere responsabile di questa operazione. Grazie a questa forma iniziale continua a ridisegnare senza problemi (inclusa la mia gif funzionante). ShowProgressGifDelegate e HideProgressGifDelegate sono delegati in forma che impostano la proprietà visible di pictureBox con gif su true / false.

Nota che in Windows, tradizionalmente non usi Gif animate, ma piccole animazioni AVI: c’è un controllo nativo di Windows solo per visualizzarle. Esistono anche strumenti per convertire GIF animate in AVI (e viceversa).

Se lo metti in un controllo PictureBox, dovrebbe funzionare

Non lo fa quando si avvia una lunga operazione dietro, perché tutto FERMA dal momento che ‘Sei nella stessa discussione.

Ho avuto lo stesso problema e mi sono imbattuto in diverse soluzioni implementando le quali ero solito affrontare diversi problemi. Infine, di seguito è quello che ho messo insieme alcuni pezzi di post diversi che hanno funzionato per me come previsto.

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

Ecco il metodo di esecuzione che svolge anche il richiamo del controllo 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; }); } 

Tieni presente che PictureBox è invisibile dalla finestra delle proprietà o viene eseguita di seguito:

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