كيفية عرض الرسوم المتحركة gif من خلال عملية غير متزامنة?

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

  •  20-09-2019
  •  | 
  •  

سؤال

لدي Winforms التطبيق في C# التي المكالمات مكالمات الأسلوب بشكل غير متزامن و يستخدم الاستدعاء.أود أن عرض الرسوم المتحركة gif إلى السماح للمستخدم يعرفون أن العمل يجري القيام به.أود أن يكون gif المتحركة تحوم فوق مدينة النموذج.

كيف يمكن أن أفعل هذا ؟

تحديث:شكراأعتقد أن خطوة كنت في عداد المفقودين تم استخدام مربع صورة لعقد gif.التالية يبدو أن تفعل خدعة تبين gif مثل jmatthews3865 وقال أدناه أنا يمكن فقط تعيين الخاصية مرئي من PictureBox إلى الكاذبة لإخفاء ذلك.

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;
}
هل كانت مفيدة؟

المحلول

وفي النموذج الخاص بك، ببساطة تشمل صورة مع انها مجموعة الخاصية مرئي إلى false.

ومن الحدث الذي يدعو عملية المتزامن منذ فترة طويلة (button1_click الخ)، وتعيين الخاصية الصور الرؤية إلى true. وقع الحدث، تظهر الصورة، ويدير عملية المتزامن وموضوع واجهة المستخدم الخاص بك لا يزال ينبغي أن تستجيب.

وفي الحدث رد الاتصال تعيين الصور الخاصية مرئي إلى false تشير إلى أن اكتمال العملية.

نصائح أخرى

وتحتاج بعض التعليمات البرمجية لإعطاء إجابة محددة، ولكن هذا هو تافهة إلى حد ما، إدراج الصورة المتحركة قبل إجراء المكالمة غير المتزامن، ثم حذفها في الاستدعاء.

وهذا هو الجواب. أنا باستخدام 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); 
    } 
   }

تعديل التعليمات البرمجية أعلاه قليلا وسوف لا رمي خطأ "c# الاحتجاج أو 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);
        }

    }

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top