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

StackOverflow https://stackoverflow.com/questions/165735

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

  1. Поместите поле с картинками в свою форму.
  2. Добавьте GIF-файл в качестве изображения в picturebox
  3. Покажите поле с картинками при загрузке.

Что следует принять во внимание:

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

Анимированные GIF-файлы:

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

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

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

Другие советы

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

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

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

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

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

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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top