Je travaille sur un programme qui affiche l'heure à partir du moment où vous avez cliqué sur un bouton. Le problème est que l’heure n’affiche que «1», «2», «3», etc. lorsque je souhaite qu’elle soit affichée sous la forme «00:00:01», «00:00:02»
C'est dans WPF. J'ai cherché partout pour trouver des gens qui disent que vous utilisez
private int increment = 0;
private void dtTicker(object sender, EventArgs e)
{
increment++;
lblTest.Content = increment.ToString("hh\\:mm\\:ss\\.fff");
}
private void StartStop_Click(object sender, EventArgs e)
{
DispatcherTimer dt = new DispatcherTimer();
if ((string)StartStop.Content == "START")
{
dt.Interval = new TimeSpan(0, 0, 1);
dt.Tick += dtTicker;
dt.Start();
mais quand je fais cela, il montre littéralement "hh: mm: ss" dans mon programme. Ci-dessous mon code. J'ai coupé les trucs sans importance pour que vous n'ayez pas à lire tout ça. Merci d'avance!
increment.ToString("hh\\:mm\\:ss\\);
4 Réponses :
Votre minuterie est configurée avec un intervalle de 1 seconde. Sauf si vous modifiez l'incrément variable ailleurs, l'incrément doit refléter le nombre de secondes écoulées.
Pour afficher au format requis, vous pouvez convertir le nombre en TimeSpan en utilisant TimeSpan.FromSeconds
00:00:34
Veuillez noter que le format par défaut est "hh: mm: ss", donc vous pouvez ignorer le formatage '
Sortie
var increment = 34; lblTest.Content =TimeSpan.FromSeconds(increment).ToString();
@gdoron Je pensais que le formatage par défaut était "hh: mm: ss". C'est pourquoi je l'ai sauté
La chaîne de format que vous utilisez est destinée à un DateTime et un TimeSpan, pas à un entier. Vous ne pouvez pas réellement vous fier à la précision de DispatchTimer à 100%, alors notez l'heure actuelle lorsque vous le démarrez:
TimeSpan elapsed = DateTime.Now - start;
string str = elapsed.ToString("hh\\:mm\\:ss");
Ensuite, dans votre gestionnaire de graduation, calculez le temps écoulé et transmettez-le chaîne de format que vous utilisez:
private DateTime start; // .. start timer... start = DateTime.Now;
DateTime.Now - start fait réinitialiser le minuteur à chaque fois que je clique sur StartStop. Un moyen de contourner cela?
Bien sûr, réglez-le simplement sur DateTime.Now lorsque vous initialisez le minuteur pour la première fois au lieu de chaque fois que vous le démarrez.
Vous utilisez la fausse hypothèse que DispatcherTimer déclenchera son événement Tick exactement chaque seconde. Ce n'est pas forcément le cas.
Ce que vous voulez faire, c'est prendre le temps de démarrage et afficher le temps écoulé après cela dans chaque tick. Quelque chose comme ceci:
private TimeSpan timeElapsed = TimeSpan.Zero;
private DateTime started = DateTime.MinValue;
private void StartStop_Click(object sender, EventArgs e)
{
DispatcherTimer dt = new DispatcherTimer();
if ((string)StartStop.Content == "START")
{
dt.Interval = new TimeSpan(0, 0, 1);
dt.Tick += dtTicker;
started = DateTime.Now;
dt.Start();
}
}
private void dtTicker(object sender, EventArgs e)
{
timeElapsed = timeElapsed.Add(DateTime.Now - started);
lblTest.Content = (timeElapsed).ToString(@"hh\:mm\:ss");
}
// This is how you reset the timer in this version.
private void ResetTimer()
{
timeElapsed = TimeSpan.Zero;
}
(DateTime.Now - started) fait réinitialiser le minuteur à chaque fois que je clique sur StartStop. Un moyen de contourner cela?
Oui. J'ai modifié ma réponse pour montrer comment. Remarque J'ai également ajouté un champ booléen appelé resetTimer que vous pouvez utiliser pour réinitialiser le minuteur si vous le souhaitez.
Vous me donnez des conseils très utiles et je l'apprécie. Cependant, les mises à jour actuelles en font un minuteur continu. Si j'arrête le chronomètre, il affichera l'heure à laquelle je l'ai arrêté, mais dès que je le reprendrai, il ajoutera également tout le temps écoulé. Est-il possible de le faire pour que je puisse l'arrêter à un certain moment, puis le reprendre à ce moment précis? Merci!
Sûr. J'ai à nouveau modifié ma réponse. J'ai ajouté un champ TimeSpan qui représentera le temps passé lorsque dt est en cours d'exécution. J'ai également modifié le réglage du démarré à chaque fois que vous démarrez la minuterie et ajouté une méthode pour réinitialiser l'affichage.
Afin d'obtenir votre temps écoulé sans compter les heures d'arrêt de la minuterie, vous devez stocker deux valeurs:
var nextPointInTime = DateTime.Now; totalElapsed += (nextPointInTime - lastPointInTime); lastPointInTime = nextPointInTime; lblTest.Content = totalElapsed.ToString(@"hh\:mm\:ss"); // format string optional
Initialiser lastPointInTime lorsque la minuterie ( re) démarre
dt.Interval = new TimeSpan(0, 0, 1); dt.Tick += dtTicker; // reset lastPointInTime in order to skip time from when the timer was stopped lastPointInTime = DateTime.Now; dt.Start();
Et utilisez-le pour chaque tick afin de mettre à jour totalElapsed avant de l'afficher
/// <summary> /// Global counter that increments while the timer is active /// </summary> private TimeSpan totalElapsed = new TimeSpan(0); /// <summary> /// Save the last relevant point in time to compute the next elapsed increment /// </summary> private DateTime lastPointInTime = DateTime.MinValue;
L'incrément est un nombre, vous devez utiliser
TimeSpanouDateTimepour que le formatage fonctionne. BTWTimeSpan.ToString ()renvoie la valeur formatée comme vous le souhaitez.