2009-05-23 20 views
21

Silverlight için StopWatch yok.Silverlight için kronometre?

Bunun yerine ne kullanırsınız?

boş bir animasyon oluşturmak ve ben işe alamadım Storyboard sınıfından GetCurrentTime() aramak söyleyerek insanlar hakkında bazı mesajları ...

ne yapardınız gördü?

+2

bu sayfayı ilginç bulduğu için görünüyor - http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.startnew(v=VS.95).aspx –

+0

@James This is gerçekten çok ilginç. Ya bu sayfa sadece hatayla ya da belki SL5'e geliyor. Bu gönderi, WP7 dll'ye referans gösterebileceğinizi ve bu Kronometre sınıfını kullanabileceğinizi gösterir. Yine de denemedim. http://forums.silverlight.net/forums/p/207108/486425.aspx – Oskar

+1

@James, @Oskar: Silverlight için kronometre var, ancak sadece XNA Framework için. Bağlantınızın Sürüm Bilgileri bölümüne bakın ve bunu System.Boolean: http://msdn.microsoft.com/en-us/library/system gibi bir yöntemle karşılaştırın.boolean% 28v = VS.95% 29.aspx –

cevap

2

Bununla ilgili yapabileceğiniz birkaç şey var. Yumruk, here kişisi gibi Environment.TickCount gibi bir şey kullanır. Ancak, daha iyi çalışabileceğini düşündüğüm bir şey, DispatcherTimer'dan yararlanmaktır.

Bir kronometre gibi çalışmak için bir DispatcherTimer ayarlamak için, çalıştırıldığı zamanı gösteren ilişkili bir TimeSpan'a da ihtiyacımız var. DispatcherTimer'ı başlatabilir ve zaman aralığını ve Tick olayının işleyicisini ayarlayabiliriz. Biz kronometre verilerini başlatmak ve bizim sayacı durdurmak için basit bir şey yaratmak, hem de görüntüleyebilir arayüzünde

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

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

:

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

, tüm kalan olay işleyicileri olduğunu.
OnTimerTick işleyicisi kronometre verimizi artıracak ve gösterecektir.
Başlatma işleyicimiz, TimeSpan'ımızı başlatma/yenileme işlemlerini gerçekleştirirken, Stop işleyicisi DispatcherTimer'i durdurur.

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

Aynı yaklaşımı kullanmayı denedim, ancak sonuç doğru değil. Belki de çalışma yükü veya donanım nedeniyle, uygulamadaki zaman gerçek duvar saatinden daha yavaş çalışır. Lütfen yardım edip düzeltebilir misiniz? – letsc

6

Saatim here adresinde görün. Kaynak kodu here. Ve bu konuda iki makale here ve here. Silverlight animasyon modeli kendini iyi bir kronometre ile ödünç verir.

ve bu film şeridi çalıştırmak için kod

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

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

buradadır:

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

    Run.Begin(); 

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

Çok komik! Haha –

+0

Bu sorunun ne kadar kattığından emin değilim, ama çok güzel! – Aardvark

4

projenize ekleyebileceğiniz bir Stopwatch yedek sınıftır.

+0

Paylaşım, harika uygulama için teşekkürler: D –

23

Yaptığım şey budur. Basit ve benim için çok iyi çalıştı:

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

yapmanız gereken tek şey, hedef görevi başlamadan önce toplam kene tutan bir uzun değişken tutmak oldu.

+0

iyi bir basit çözüm, ben bir hayranıyım. – themaestro

+1

Saat dilimlerini vb. Önemsemediğiniz sürece "DateTime.UtcNow" öğesini kullanın. – Yaur