2009-05-23 12 views
21

No hay cronómetro para Silverlight.Cronómetro para silverlight?

¿Qué usarías en lugar de él?

vi algunas entradas sobre personas que dicen para crear una animación vacío y llamarlo GetCurrentTime() de la clase Storyboard, no pude conseguir que funcione ...

¿Qué haría usted?

+2

interesante ya que esta página parece indicar que existe - http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.startnew(v=VS.95).aspx –

+0

@James Eso es de hecho muy interesante. O bien esa página está allí por error, o tal vez está llegando a SL5. Esta publicación sugiere que podrías hacer referencia al dll WP7 y usar esa clase de cronómetro. No lo he intentado sin embargo. http://forums.silverlight.net/forums/p/207108/486425.aspx – Oskar

+1

@James, @Oskar: existe cronómetro para Silverlight, pero solo para XNA Framework. Consulte la sección Información sobre la versión de su enlace y compárelo con algo parecido a System.Boolean: http://msdn.microsoft.com/en-us/library/system.boolean% 28v = VS.95% 29.aspx –

Respuesta

2

Hay algunas cosas que puede hacer con esto. El primer uso es algo parecido al Environment.TickCount como la persona here. Sin embargo, algo que creo que puede funcionar mejor es hacer uso de un DispatcherTimer.

Para configurar un DispatcherTimer para que funcione como un cronómetro, también necesitaremos un TimeSpan asociado que represente la hora en que se ejecuta. Podemos crear una instancia del DispatcherTimer y establecer el intervalo que mide, y el controlador para el 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); 
} 

En la interfaz de usuario se puede crear algo sencillo para iniciar y detener nuestra temporizador, así como mostrar los datos cronómetro:

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

Ahora, todo lo que queda es los controladores de eventos.
El controlador OnTimerTick aumentará y mostrará nuestros datos de cronómetro.
Nuestro controlador de inicio se encargará de inicializar/reactivar nuestro TimeSpan, mientras que el controlador de detención simplemente detendrá el 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

He intentado utilizar el mismo enfoque, sin embargo, el resultado no es correcto. Tal vez debido a la sobrecarga de la función o debido al hardware, el tiempo en la aplicación es más lento que el reloj de pared real. ¿Podría por favor ayudar y arreglar esto? – letsc

6

Ver mi reloj en here. El código fuente es here. Y dos artículos al respecto son here y here. El modelo de animación de Silverlight se presta bien a un cronómetro.

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

y el código para ejecutar ese guión gráfico está aquí:

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

    Run.Begin(); 

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

¡Muy gracioso! Haha –

+0

No estoy seguro de cuánto esto se agrega a la pregunta, ¡pero muy bueno! – Aardvark

4

Aquí es una clase Stopwatch de reemplazo que se pueden agregar a su proyecto.

+0

Gracias por compartir, gran implementación: D –

23

Esto es lo que hice. Su simple y funcionó muy bien para mí:

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

Todo lo que tenía que hacer era mantener una variable largo que sostiene las garrapatas totales antes de comenzar la tarea de destino.

+0

buena solución simple, soy un fan. – themaestro

+1

Use 'DateTime.UtcNow' a menos que realmente se preocupe por las zonas horarias, etc. – Yaur