2009-05-23 11 views
21

Non c'è StopWatch per Silverlight.Cronometro per Silverlight?

Cosa vorresti usare al posto di esso?

Ho visto alcune post su persone che dicono per creare un'animazione vuoto e chiamare GetCurrentTime() dalla classe Storyboard, non ho potuto farlo funzionare ...

Cosa faresti?

+2

interessante poiché questa pagina sembra indicare che esiste - http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.startnew(v=VS.95).aspx –

+0

@James che è davvero molto interessante. O quella pagina è lì per errore, o forse arriva a SL5. Questo post suggerisce di poter fare riferimento alla DLL WP7 e utilizzare quella classe di cronometro. Non l'ho provato però. http://forums.silverlight.net/forums/p/207108/486425.aspx – Oskar

+1

@James, @Oskar: il cronometro per Silverlight esiste, ma solo per XNA Framework. Vedere la sezione Informazioni sulla versione del collegamento e confrontarla con qualcosa come System.Boolean: http://msdn.microsoft.com/en-us/library/system.booleano% 28v = VS.95% 29.aspx –

risposta

2

Ci sono alcune cose che potresti fare con questo. Il pugno usa qualcosa come Environment.TickCount come la persona here. Tuttavia, qualcosa che penso possa funzionare meglio è utilizzare uno DispatcherTimer.

Per impostare un DispatcherTimer in modo che funzioni come un cronometro, è necessario anche un TimeSpan associato che rappresenti l'ora in cui viene eseguito. Possiamo creare un'istanza di DispatcherTimer e impostare l'intervallo in base al momento e il gestore per l'evento 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); 
} 

Nell'interfaccia utente possiamo creare qualcosa di semplice per avviare e fermare la nostra timer, così come visualizzare i dati del cronometro:

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

Ora, tutto ciò che rimane è il gestori di eventi.
Il gestore OnTimerTick incrementerà e visualizzerà i dati del cronometro.
Il nostro gestore di Start si prenderà cura di inizializzare/reinizializzare il nostro TimeSpan, mentre il gestore di Stop fermerà il 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

Ho provato a utilizzare lo stesso approccio, tuttavia il risultato non è corretto. Forse a causa dell'overhead della funzione o dell'hardware, il tempo nell'app viene eseguito più lentamente rispetto al clock effettivo. Potresti per favore aiutare e risolvere questo? – letsc

6

Vedere il mio orologio allo here. Il codice sorgente è here. E due articoli a riguardo sono here e here. Il modello di animazione Silverlight si presta bene a un cronometro.

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"/> 

e il codice per eseguire tale storyboard è qui:

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

    Run.Begin(); 

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

Molto divertente! Haha –

+0

Non sono sicuro di quanto questo aggiunge alla domanda, ma molto bello! – Aardvark

4

Ecco una classe Stopwatch di sostituzione che è possibile aggiungere al progetto.

+0

Grazie per la condivisione, ottima implementazione: D –

23

Questo è quello che ho fatto. La sua semplice e ha lavorato molto bene per me:

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

Tutto quello che dovevo fare era mantenere una variabile lungo tenendo le zecche totale prima di iniziare l'operazione di destinazione.

+0

buona soluzione semplice, sono un fan. – themaestro

+1

Usa 'DateTime.UtcNow' a meno che tu non ti preoccupi dei fusi orari, ecc. – Yaur

Problemi correlati