0

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

タイミングで考慮していないことは何ですか?

4

3 に答える 3

2

UI は、コントロール プロパティを変更してもすぐには更新されません。スレッドがアイドル状態になったとき (つまり、すべてのイベント ハンドラーの実行が終了した後) にのみ更新されます。

Thread.Sleep はスレッドをブロックし、イベント ハンドラーは実行を終了せず、UI は再描画されません。

別のタイマーを使用する (既存のタイマーの最後のティックで新しいタイマーを開始し、新しいタイマーのティックで TakePicture を呼び出す) か、既存のタイマーの最後のティックを使用する必要があります(_countdown <= _countdownMax)(_countdown == _countdownMax + 1).

于 2009-12-08T08:58:41.490 に答える
1

ディスプレイに常に残り秒数より1少ない数を表示させてはどうでしょうか。そうすれば、ゼロに達したときに(明らかに、-1が表示されないようにMath.Max(0、_countdown)を使用して)、あと1秒あるにもかかわらず、時間がなくなったように見えます。

編集:私が意味するつもりでしたが、述べていませんでした-その場合、 Tickハンドラーを1つだけ持つことができ、 Sleepをまったく使用しないで、UIをブロックしてしまい、UIの更新がブロックされる可能性があります。

于 2009-12-08T05:08:21.387 に答える
0

イベントは、イベントハンドラーが登録された順序でトリガーされることを保証するとは思いません。試す

_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();
        }
      });
    }
于 2009-12-08T05:03:51.257 に答える