Как вы показываете анимированные GIF-файлы в форме Windows (c #) - PullRequest
134 голосов
/ 03 октября 2008

У меня есть форма, показывающая сообщения о проделанной работе во время довольно длительного процесса. Это вызов веб-службы, поэтому я не могу реально показать процентное значение в строке прогресса. (Мне не особенно нравится свойство Marquee индикатора выполнения)

Я хотел бы показать анимированный GIF, чтобы дать процессу ощущение некоторой активности (например, файлы, летящие с одного компьютера на другой, например процесс копирования Windows).

Как ты это делаешь?

Ответы [ 6 ]

232 голосов
/ 03 октября 2008

Это не так уж сложно.

  1. Перетащите коробку с картинками на форму.
  2. Добавьте файл .gif в качестве изображения в поле для картинок
  3. Показывать изображение во время загрузки.

Что нужно учитывать:

  • Отключение Picturebox предотвратит анимацию GIF.

Анимированные GIF:

Если вы ищете анимированные GIF-файлы, вы можете сгенерировать их здесь

Еще один способ сделать это:

Другой способ, который, как я обнаружил, работает достаточно хорошо, - это управление асинхронным диалогом, которое я нашел в проекте кода

11 голосов
/ 19 декабря 2010

У меня была такая же проблема. Вся форма (включая gif) останавливается, чтобы перерисовать себя из-за длительной работы в фоновом режиме. Вот как я решил это.

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

Я просто создал другой поток, который будет отвечать за эту операцию. Благодаря этой первоначальной форме продолжает перерисовывать без проблем (в том числе моя работа с GIF). ShowProgressGifDelegate и HideProgressGifDelegate являются делегатами в форме, которые устанавливают видимое свойство pictureBox с gif в значение true / false.

6 голосов
/ 03 октября 2008

Обратите внимание, что в Windows вы традиционно не используете анимированные Gif-файлы, а небольшие AVI-анимации: для их отображения есть собственный элемент управления Windows. Есть даже инструменты для преобразования анимированных GIF-файлов в AVI (и наоборот).

3 голосов
/ 03 октября 2008

Если вы поместите его в элемент управления PictureBox, он должен просто работать

1 голос
/ 17 февраля 2009

Это не так, когда вы начинаете долгую операцию позади, потому что все ОСТАНАВЛИВАЕТСЯ, поскольку вы находитесь в одном потоке.

0 голосов
/ 08 февраля 2017

У меня была та же проблема, и я сталкивался с различными решениями, применяя которые я сталкивался с несколькими разными проблемами. Наконец, ниже я собрал несколько фрагментов из разных постов, которые сработали для меня, как и ожидалось.

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

Вот метод Execution, который также вызывает вызов элемента управления 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; });
}

Имейте в виду, что PictureBox невидим из окна свойств или выполните ниже:

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