2009-05-23 6 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을 사용하는 것입니다.

스톱워치처럼 작동하도록 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 핸들러는 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입니다. 그것에 관한 두 개의 기사는 herehere입니다. Silverlight 애니메이션 모델은 스톱워치에 적합합니다.

하고 스토리 보드를 실행하는 코드

<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

은 여기에 있습니다 :

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

목표 작업을 시작하기 전에 하나의 긴 변수를 총 틱수로 유지해야했습니다.

+0

좋은 간단한 해결책, 저는 팬입니다. – themaestro

+1

시간대 등을 실제로 신경 쓰지 않는 한'DateTime.UtcNow'를 사용하십시오. – Yaur