it-roy-ru.com

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

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

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

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

132
Stuart Helwig

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

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

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

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

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

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

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

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

227
FryHard

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

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

6
PhiLho

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

3
Grank

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

1
Marc

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

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
M. Fawad Surosh