Как вы показываете анимированные GIF-файлы в Windows Form (c #)
-
03-07-2019 - |
Вопрос
У меня есть форма, показывающая сообщения о ходе выполнения по мере выполнения довольно длительного процесса.Это вызов веб-службы, поэтому я не могу осмысленно показать процент выполнения на индикаторе выполнения.(Мне не особенно нравится свойство Marquee индикатора выполнения)
Я хотел бы показать анимированный GIF-файл, чтобы придать процессу ощущение какой-то активности (напримерфайлы, перелетающие с одного компьютера на другой подобно процессу копирования Windows).
Как вы это делаете?
Решение
Это не слишком сложно.
- Поместите поле с картинками в свою форму.
- Добавьте GIF-файл в качестве изображения в picturebox
- Покажите поле с картинками при загрузке.
Что следует принять во внимание:
- Отключение 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;
}