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

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

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

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

для анимации изображения вы можете использовать этот контроллер. codeproject.com/Tips/1004624/Gif-viewer-Snipper-control

xwpedram 28.06.2015 00:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
147
1
282 035
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

Если только вы не отключите форму;)

Jeff B 03.08.2013 01:56
Ответ принят как подходящий

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

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

На что следует обратить внимание:

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

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

Если вы ищете анимированные гифки, вы можете их сгенерировать:

AjaxLoad - генератор гифок с загрузкой Ajax

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

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

Невероятно просто! МОЙ первоначальный поиск в Google этого не показал - возможно, это слишком очевидно. Спасибо.

Stuart Helwig 03.10.2008 09:13

Однако окно изображения не будет обновляться (перерисовываться) по мере выполнения процесса.

LarryBud 30.01.2015 23:45

Дурр, я по ошибке поставил его в качестве фонового изображения. Фоновое изображение, естественно, не поддерживает анимацию; изображение переднего плана делает.

neminem 23.12.2015 19:47

@neminem: То же самое! Вот почему я здесь. Какое-то время я думал, что pictureBox не поддерживает гифки с лисами (впервые использую его)

Jack 06.05.2016 23:57

@LarryBud Чтобы заставить его обновляться (перерисовывать) во время выполнения процесса, вы можете вызвать Application.DoEvents();. Возможный подход: ваша бизнес-логика запускает событие, когда что-то частично выполнено, тогда любые свойства (например, индикатор выполнения или процент) могут быть обновлены, а анимация может быть обновлена ​​с помощью Application.DoEvents ()

Do-do-new 04.09.2017 12:02

Забавно, на момент написания этой статьи, сайт загрузки ajax все еще работает и работает. В Web 2.0 говорится ... в какой версии Интернета мы сейчас работаем? ;-) Пользуюсь им лет 10 или около того ... отличный сайт.

ΩmegaMan 10.07.2020 00:29

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

Да - наверное, это то, что мне следовало спросить. Спасибо.

Stuart Helwig 03.10.2008 09:24

Ссылка на инструмент, s'il vous plaît? Или любая другая ссылка на документацию, причины почему и т. д. Было бы замечательно. Спасибо!

Jeff B 03.08.2013 01:58

Я не забочусь о написании традиционных программ для Windows. Если он поддерживается элементом управления System.Windows.Forms.PictureBox, я буду использовать только анимированные GIF-файлы.

Mike de Klerk 16.09.2013 16:03

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

И режим потока MTA кажется худшим решением, насколько я читаю на StackOverflow.

Yogurtu 13.01.2016 18:46

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

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

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

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

Public Class Form1

    Private animatedimage As New Bitmap("C:\MyData\Search.gif")
    Private currentlyanimating As Boolean = False

    Private Sub OnFrameChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

        Me.Invalidate()

    End Sub

    Private Sub AnimateImage()

        If currentlyanimating = True Then
            ImageAnimator.Animate(animatedimage, AddressOf Me.OnFrameChanged)
            currentlyanimating = False
        End If

    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

        AnimateImage()
        ImageAnimator.UpdateFrames(animatedimage)
        e.Graphics.DrawImage(animatedimage, New Point((Me.Width / 4) + 40, (Me.Height / 4) + 40))

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        BtnStop.Enabled = False

    End Sub

    Private Sub BtnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStop.Click

        currentlyanimating = False
        ImageAnimator.StopAnimate(animatedimage, AddressOf Me.OnFrameChanged)
        BtnStart.Enabled = True
        BtnStop.Enabled = False

    End Sub

    Private Sub BtnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStart.Click

        currentlyanimating = True
        AnimateImage()
        BtnStart.Enabled = False
        BtnStop.Enabled = True

    End Sub

End Class

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