Как отобразить анимированный GIF при длительной асинхронной работе? - PullRequest
1 голос
/ 18 декабря 2009

У меня есть приложение Winforms в C #, которое вызывает метод вызывает асинхронно и использует обратный вызов. Я хотел бы показать анимированный GIF-файл, чтобы конечный пользователь знал, что работа выполняется. Мне бы хотелось, чтобы анимационный курсор висел над центром формы.

Как я могу это сделать?

Обновление: Благодарю. Я предполагаю, что шаг, который я пропустил, состоял в том, чтобы использовать Picture Box, чтобы держать gif. Следующее, кажется, делает трюк, показывая gif, и как jmatthews3865 сказал ниже, я могу просто установить свойство visible для PictureBox в false, чтобы скрыть его.

private ShowAnimatedGif()
{
 PictureBox pb = new PictureBox();
 this.Controls.Add(pb);
 pb.Left = (this.Width / 2) - (pb.Width / 2);
 pb.Top = (this.Height / 2) - (pb.Height / 2);
 pb.Image = Resources.AnimatedGifHere;
 pb.Visible = true;
}

Ответы [ 4 ]

2 голосов
/ 19 декабря 2009

в вашей форме, просто включите изображение с его видимым свойством, установленным в false.

из события, которое вызывает длительный асинхронный процесс (button1_click и т. Д.), Установите для свойства видимости изображений значение true. запускается событие, появляется изображение, выполняется асинхронный процесс, и ваш поток пользовательского интерфейса все равно должен реагировать.

в вашем событии обратного вызова установите для свойства visible изображения значение false, чтобы указать, что процесс завершен.

2 голосов
/ 18 декабря 2009

Нужен код, чтобы дать точный ответ, но это довольно тривиально, вставьте gif перед тем, как сделать асинхронный вызов, а затем удалите его в обратном вызове.

1 голос
/ 04 февраля 2014

Это ответ. Я использую LoadingCircle, который является анимированным GIF-компонентом.

public partial class Form1 : Form
{
   public delegate void ProcessAnimation(bool show);
   ProcessAnimation pa;

   public Form1()
    {
        InitializeComponent();

        pa = this.ShowAnimation;
    }    

private void button2_Click(object sender, EventArgs e)
    {

        Thread tr = new Thread(FlushToServer);
        tr.Start();

    }

    private void ShowAnimation(bool show)
    {
        if (show)
        {
            loadingCircle1.Visible = true;
            loadingCircle2.Active = true;

        }
        else
        {
            loadingCircle1.Visible = false;
            loadingCircle1.Active = false;

        }
    }




    private void FlushToServer()
    {

        this.Invoke(this.pa,true);
        //your long running process
        System.Threading.Thread.Sleep(5000);
        this.Invoke(this.pa,false); 
    } 
   }
0 голосов
/ 07 апреля 2015

Я немного модифицирую приведенный выше код, и он не выдаст ошибку. "c # invoke или begininvoke не могут быть вызваны для элемента управления, пока не создан дескриптор окна."

namespace AnimateUI
{
    public partial class Form1 : Form
    {
        public delegate void ProcessAnimation(bool show);
        ProcessAnimation pa;


        public Form1()
        {
            InitializeComponent();
            pa = this.ShowAnimation;
            pictureBox1.Visible = false;
        }

        private void ShowAnimation(bool show)
        {
            if (show)
            {
                pictureBox1.Visible = true;
            }
            else
            {
                pictureBox1.Visible = false;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread tr = new Thread(StartTask);
            tr.Start();
        }

        private void StartTask()
        {
            if (!this.IsHandleCreated)
                this.CreateControl();

            this.Invoke(this.pa, true);
            System.Threading.Thread.Sleep(15000);
            this.Invoke(this.pa, false);
        }

    }

}
...