Question

Je suis à l'aide d'un DispatcherTimer pour effectuer un compte à rebours avant le déclenchement de la libération de l'appareil photo.L' UpdateCountdown la méthode utilisée pour modifier l'image affichée à l'utilisateur avant que l'appareil photo se déclenche.Plutôt que d'avoir l' TakePicture méthode d'exécution immédiate, je voudrais avoir un léger retard après le compteur atteint zéro, et la dernière image est affichée.

Le code montré ci-dessous les résultats à la pause survenant à l' _countdown = 1 point.Tandis que la dernière image s'affiche et TakePicture() les feux presque en même temps (je pense TakePicture survient en premier).

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

Que suis-je en ne tenant pas compte de mon calendrier?

Était-ce utile?

La solution

L'interface utilisateur ne met pas à jour immédiatement lorsque vous modifiez les propriétés de contrôle - il met à jour uniquement lorsque le fil devient inactif (qui est, après que tous les gestionnaires d'événements fin d'exécution)

.

blocs Thread.sleep le de fil, les gestionnaires d'événements ne terminent pas l'exécution et l'interface utilisateur n'est pas redessinée.

Vous devez soit utiliser une autre minuterie (commencer une nouvelle minuterie sur la dernière tique de la minuterie existante et appeler TakePicture sur la tique teh nouvelle minuterie) ou, mieux encore, utilisez la dernière tic-tac de l'horloge existante - mise à jour l'interface utilisateur lorsque (_countdown <= _countdownMax) , prendre la photo quand (_countdown == _countdownMax + 1).

Autres conseils

Pourquoi ne pas simplement faire de votre écran montrent toujours 1 de moins que le nombre de secondes restantes.De cette façon, lorsque vous arrivez à zéro, (évidemment avec les Mathématiques.Max(0, _countdown) pour empêcher montrant -1), il semble comme le temps, même si il y a une seconde de plus pour aller.

Edit:Ce que je voulais implique, mais n'a pas d'état - c'est qu'il suffit ensuite d' un Tique de gestionnaire et de ne pas utiliser le Sommeil à tout ce qui sera juste le vent de blocage de l'INTERFACE utilisateur d'une manière qui sera probablement bloquer votre INTERFACE utilisateur de mise à jour.

Je ne pense pas que les événements garantissent que les gestionnaires d'événements sont déclenchés dans l'ordre de leur enregistrement. Essayez

_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();
        }
      });
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top