سؤال

أنا أستخدم DispatcherTimer لأداء العد لأسفل قبل تشغيل الإصدار على الكاميرا. ال UpdateCountdown يتم استخدام الطريقة لتغيير الصورة المعروضة للمستخدم قبل حرائق الكاميرا. بدلا من وجود TakePicture طريقة تنفيذه على الفور، أود أن يكون لدي تأخير طفيف بعد أن يصل العداد إلى الصفر وعرض الصورة الأخيرة.

الكود الموضح أدناه يؤدي إلى وقفة تحدث في _countdown = 1 نقطة. في حين أن الصورة النهائية تعرض و TakePicture() حرائق في وقت واحد تقريبا (أعتقد TakePicture يحدث أولا).

_countdownTimer = new DispatcherTimer();
_countdownTimer.Interval = TimeSpan.FromSeconds(1);
_countdownTimer.Tick += new EventHandler(delegate(object s, EventArgs a)
     { UpdateCountdown(); } );

_countdownTimer.Tick += new EventHandler(delegate(object s, EventArgs a)
     {if (_countdown == _countdownMax)
        {
            System.Threading.Thread.Sleep(2000);  // Slight delay before taking picture
            Camera.TakePicture();
        } });
    }

public void StartCountdown()
{
    if (doCount)
    {
        doCount = false;
        UpdateCountdown();
        _countdownTimer.Start();
    }
}

private void UpdateCountdown()
{
    _countdown--;
    CountdownImage = _countDownImages[_countdown]; // Data bound to Image Control

     if (_countdown == 0)
     {
       _countdown = _countdownMax;
       _countdownTimer.Stop();
       doCount = true;
      }

ما أنا لا أختبر في الاعتبار مع توقيتي؟

هل كانت مفيدة؟

المحلول

لا يتم تحديث واجهة المستخدم على الفور عند تغيير خصائص التحكم - يقوم بالتحديثات فقط عندما يصبح الخيط خمول (أي، بعد الانتهاء من تنفيذ معالجات الأحداث الخاصة بك).

reced.Sleep كتل الخيط، ومعالجات الأحداث لا تنتهي من تنفيذ و UI غير مجددة.

عليك إما استخدام مؤقت آخر (ابدأ تشغيل مؤقت جديد في القراد الأخير من المؤقت الموجود والاتصال باستقلاق في علامة Teh Timer الجديد) أو، وحتى أفضل، استخدم علامة الأخيرة للموقت الحالي - تحديث UI عندما (_countdown <= _countdownMax), ، التقاط الصورة عندما (_countdown == _countdownMax + 1).

نصائح أخرى

لماذا لا تجعل عرضك دائما تظهر دائما 1 أقل من عدد الثواني المتبقية. بهذه الطريقة عندما تصل إلى الصفر، (من الواضح بوضوح مع math.max (0، _countdown) لمنع عرض -1) يبدو أن الوقت قد نفد على الرغم من أن هناك ثانية واحدة للذهاب.

تحرير: ما قصدته أن يعني ولكن لم تكن الدولة - هل كان لديك بعد ذلك واحد معالج القراد وعدم استخدام النوم على الإطلاق والتي سوف تعيق فقط حظر UI على أي حال والتي من المحتمل أن تمنع UI من التحديث.

لا أعتقد أن الأحداث تضمن أن معالجات الأحداث يتم تشغيلها بالترتيب المسجلين. يحاول

_countdownTimer.Tick += new EventHandler(delegate(object s, EventArgs a)     
{
        UpdateCountdown();
        if (_countdown == _countdownMax)
        {
            System.Threading.Thread.Sleep(2000);  // Slight delay before taking picture
            Camera.TakePicture();
        }
      });
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top