2009-05-23 5 views
21

Il n'y a pas de StopWatch pour Silverlight.Chronomètre pour silverlight?

Que voulez-vous utiliser à la place?

J'ai vu des messages au sujet des personnes disant pour créer une animation vide et appeler GetCurrentTime() de la classe Storyboard, je ne pouvais pas le faire fonctionner ...

Que feriez-vous?

+2

intéressant puisque cette page semble indiquer qu'il existe - http://msdn.microsoft.com/fr-fr/library/system.diagnostics.stopwatch.startnew(v=VS.95).aspx –

+0

@James C'est en effet très intéressant. Soit cette page est juste là par erreur, soit peut-être qu'elle arrive à SL5. Ce post suggère que vous pourriez référencer la DLL WP7 et utiliser cette classe Stopwatch. Je n'ai pas essayé cependant. http://forums.silverlight.net/forums/p/207108/486425.aspx – Oskar

+1

@James, @Oskar: Chronomètre pour Silverlight existe, mais seulement pour le XNA Framework. Consultez la section Informations sur la version de votre lien et comparez-la avec quelque chose comme System.Boolean: http://msdn.microsoft.com/en-us/library/system.boolean% 28v = VS.95% 29.aspx –

Répondre

2

Il y a quelques choses que vous pourriez faire avec ceci. Le poing est quelque chose comme l'environnement.TickCount comme la personne here. Cependant, quelque chose que je pense peut fonctionner mieux est d'utiliser un DispatcherTimer.

Pour configurer un DispatcherTimer afin de fonctionner comme un chronomètre, nous avons également besoin d'un TimeSpan associé représentant l'heure à laquelle il est exécuté. Nous pouvons instancier le DispatcherTimer et définir l'intervalle auquel il est associé, ainsi que le gestionnaire de l'événement Tick.

DispatcherTimer _timer; 
TimeSpan _time; 
public Page() 
{ 
    InitializeComponent(); 
    _timer = new DispatcherTimer(); 

    _timer.Interval = new TimeSpan(0, 0, 0, 0, 10); 
    _timer.Tick += new EventHandler(OnTimerTick); 
} 

Dans l'interface utilisateur, nous pouvons créer quelque chose de simple pour démarrer et arrêter notre minuterie, ainsi que l'affichage des données du chronomètre:

<StackPanel> 
     <Button Content="Start" x:Name="uiStart" Click="OnStartClick" /> 
     <Button Content="Stop" x:Name="uiStop" Click="OnStopClick" /> 
     <TextBlock x:Name="uiDisplay"/> 
</StackPanel> 

Maintenant, tout ce qui reste est les gestionnaires d'événements.
Le gestionnaire OnTimerTick va incrémenter et afficher les données du chronomètre.
Notre gestionnaire de démarrage s'occupera de l'initialisation/de la réinitialisation de notre TimeSpan, tandis que le gestionnaire d'arrêt arrêtera simplement le DispatcherTimer.

void OnTimerTick(object sender, EventArgs e) 
{ 
    _time = _time.Add(new TimeSpan(0, 0, 0, 0, 10)); 
    display.Text = _time.ToString(); 
}  
private void OnStartClick(object sender, RoutedEventArgs e) 
{ 
    _time = new TimeSpan(0,0,0,0,0); 
    _timer.Start(); 
} 
private void OnStopClick(object sender, RoutedEventArgs e) 
{ 
    _timer.Stop(); 
} 
+0

J'ai essayé d'utiliser la même approche, mais le résultat n'est pas correct. Peut-être en raison de la surcharge de la fonction ou en raison de matériel, l'heure dans l'application s'exécute plus lentement que l'horloge murale réelle. Pourriez-vous s'il vous plaît aider et résoudre ce problème? – letsc

6

Voir ma montre au here. Le code source est here. Et deux articles à ce sujet sont here et here. Le modèle d'animation Silverlight se prête bien à un chronomètre.

alt text http://xmldocs.net/ball2/background.png

<Storyboard x:Name="Run" RepeatBehavior="Forever"> 
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
    Storyboard.TargetName="SecondHand" x:Name="SecondAnimation" 
    Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" RepeatBehavior="Forever"> 
    <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> 
    <SplineDoubleKeyFrame KeyTime="00:01:00" Value="360"/> 
</DoubleAnimationUsingKeyFrames> 
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
    Storyboard.TargetName="MinuteHand" 
    Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" RepeatBehavior="Forever"> 
    <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> 
    <SplineDoubleKeyFrame KeyTime="01:00:00" Value="360"/> 
</DoubleAnimationUsingKeyFrames> 
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
    Storyboard.TargetName="HourHand" 
    Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[2].(RotateTransform.Angle)" RepeatBehavior="Forever"> 
    <SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/> 
    <SplineDoubleKeyFrame KeyTime="12:00:00" Value="360"/> 

et le code à exécuter ce story-board est ici:

private void RunWatch() 
{ 
    var time = DateTime.Now; 

    Run.Begin(); 

    Run.Seek(new TimeSpan(time.Hour, time.Minute, time.Second)); 
} 
+5

Très drôle! Haha –

+0

Je ne sais pas à quel point cela ajoute à la question, mais très bien! – Aardvark

4

Voici une classe de remplacement Stopwatch que vous pouvez ajouter à votre projet.

+0

Merci pour le partage, grande mise en œuvre: D –

23

C'est ce que j'ai fait. Son simple et fonctionnait très bien pour moi:

long before = DateTime.Now.Ticks; 
DoTheTaskThatNeedsMeasurement(); 
long after = DateTime.Now.Ticks; 

TimeSpan elapsedTime = new TimeSpan(after - before); 
MessageBox.Show(string.Format("Task took {0} milliseconds", 
    elapsedTime.TotalMilliseconds)); 

Tout ce que vous aviez besoin de faire était de garder une variable longue tenant les tiques totales avant de commencer la tâche cible.

+0

bonne solution simple, je suis un fan. – themaestro

+1

Utilisez 'DateTime.UtcNow' sauf si vous vous souciez réellement des fuseaux horaires, etc. – Yaur

Questions connexes