2009-05-23 10 views
21

Silverlight用のStopWatchはありません。銀色のストップウォッチ?

代わりに何を使用しますか?

私はストーリーボードクラスから空のアニメーションを作成し、(GetCurrentTimeを呼び出すために言って人々)に関するいくつかの記事を見て、私はそれが仕事を得ることができませんでした...

あなたは何をしますか?

+2

このページは存在しているようだから - http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.startnew(v=VS.95).aspx –

+0

@James That is確かに非常に興味深い。そのページはちょうどそこにエラーがあるか、SL5に来ているかもしれません。このポストはWP7 dllを参照し、そのStopwatchクラスを使用できることを示唆しています。私はそれを試していない。 http://forums.silverlight.net/forums/p/207108/486425.aspx – Oskar

+1

@James、@Oskar:Silverlight用のストップウォッチは存在しますが、XNA Framework用です。あなたのリンクのバージョン情報セクションを見て、それをSystem.Booleanのようなものと比較してください:http://msdn.microsoft.com/en-us/library/system。ブール値%28v = VS.95%29.aspx –

答えて

2

これにはいくつかのことがあります。拳は、hereのようにEnvironment.TickCountのようなものを使用しています。しかし、私がうまくいくと思うことは、DispatcherTimerを使うことです。

Stoppatchesのように動作するようにDispatcherTimerを設定するには、実行されている時間を表すTimeSpanも関連付けられている必要があります。 DispatcherTimerをインスタンス化し、それが実行される間隔とTickイベントのハンドラを設定できます。我々はストップウォッチデータを開始し、私たちのタイマーを停止するのは簡単なものを作るだけでなく、表示することができUIで

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

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

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

、すべてのことが残っているが、イベントハンドラです。
OnTimerTickハンドラは、ストップウォッチデータをインクリメントして表示します。
Start HandlerがTimeSpanの初期化/再活性化を行いますが、Stopハンドラは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

私は同じアプローチを使ってみましたが、結果は正しくありませんでした。たぶん機能オーバーヘッドやハードウェアのために、アプリの時間が実際の壁時計よりも遅くなります。あなたは助けてこれを修正できますか? – letsc

6

私の時計はhereです。ソースコードはhereです。それに関する2つの記事はherehereです。 Silverlightのアニメーションモデルはストップウォッチに適しています。

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

とそのストーリーボードを実行するためのコードここにある:ここで

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

    Run.Begin(); 

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

非常に面白い!ハハ –

+0

これはどのくらい質問に追加するか分かりませんが、とても良いです! – Aardvark

4

はあなたのプロジェクトに追加することができStopwatch置換クラスです。

+0

共有してくれてありがとう、偉大な実装:D –

23

これは私がやったことです。そのシンプルでうまく働いてくれました。

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

ターゲットタスクを開始する前に、1つの長い変数に合計ティックを保持するだけでした。

+0

良い簡単な解決策、私はファンです。 – themaestro

+1

タイムゾーンなどについて実際に気にしない限り、 'DateTime.UtcNow'を使用してください。 – Yaur

関連する問題