Domanda

Ho un modulo che mostra i messaggi di avanzamento durante l'esecuzione di un processo abbastanza lungo. È una chiamata a un servizio Web, quindi non riesco davvero a mostrare una percentuale di percentuale completa su una barra di avanzamento in modo significativo. (Non mi piace particolarmente la proprietà Marquee della barra di avanzamento)

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

Come si fa?

È stato utile?

Soluzione

Non è troppo difficile.

  1. Rilascia una casella immagine nel modulo.
  2. Aggiungi il file .gif come immagine nella casella immagine
  3. Mostra la casella immagine durante il caricamento.

Cose da prendere in considerazione:

  • Disabilitando la casella immagine si impedisce l'animazione di GIF.

Gif animate:

Se stai cercando gif animate, puoi generarle qui

Un altro modo di farlo:

Un altro modo che ho scoperto che funziona abbastanza bene è il controllo della finestra di dialogo asincrona che ho trovato sul progetto di codice

Altri suggerimenti

Ho avuto lo stesso problema. Intero modulo (incluso GIF) che smette di ridisegnare se stesso a causa di una lunga operazione in background. Ecco come l'ho risolto.

  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 questo modulo iniziale continua a ridisegnare senza problemi (incluso il mio funzionamento di GIF). ShowProgressGifDelegate e HideProgressGifDelegate sono delegati in forma che impostano la proprietà visibile di pictureBox con gif su true / false.

Nota che in Windows, tradizionalmente non usi gif animate, ma piccole animazioni AVI: esiste un controllo nativo di Windows solo per visualizzarle. Esistono anche strumenti per convertire le gif animate in AVI (e viceversa).

Se lo metti in un controllo PictureBox, dovrebbe funzionare solo

Non quando si avvia una lunga operazione alle spalle, perché tutto si interrompe poiché si è nella stessa discussione.

Ho avuto lo stesso problema e mi sono imbattuto in diverse soluzioni implementando che ho affrontato diversi problemi. Infine, di seguito è quello che ho messo insieme alcuni pezzi di diversi post 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 Execution che porta anche a invocare il 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 fai quanto segue:

private void ComparerForm_Load(object sender, EventArgs e)
{
    pictureBox1.Visible = false;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top