Как вы показываете анимированные GIF файлы в форме Windows (С#)

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

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

Как вы это делаете?

4b9b3361

Это не слишком сложно.

  • Отбросьте изображение на свою форму.
  • Добавить файл .gif в качестве изображения в окне изображения
  • Показывать изображение при загрузке.

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

  • Отключение графического блока предотвратит анимацию gif.

Анимированные картинки:

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

Другой способ сделать это:

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

211
ответ дан 03 окт. '08 в 7:59
источник

У меня была та же проблема. Целая форма (включая 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.

11
ответ дан 19 дек. '10 в 17:48
источник

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

7
ответ дан 03 окт. '08 в 8:16
источник

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

3
ответ дан 03 окт. '08 в 7:58
источник

Это не происходит, когда вы начинаете длинную операцию позади, потому что все STOPS, поскольку вы находитесь в одном и том же потоке.

1
ответ дан 17 февр. '09 в 16:57
источник

У меня была одна и та же проблема, и я столкнулся с различными решениями, выполнив то, что я использовал для решения нескольких различных проблем. И, наконец, ниже - это то, что я помещал несколько частей из разных сообщений вместе, которые работали для меня, как ожидалось.

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;
}
0
ответ дан 08 февр. '17 в 4:06
источник