Comment puis-je ajouter un délai après un compte à rebours de la minuterie
-
16-09-2019 - |
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?
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();
}
});
}