2009-05-23 4 views
21

Нет StopWatch для Silverlight.Секундомер для серебристого света?

Что бы вы использовали вместо него?

Я видел несколько сообщений о людях говорят создать пустую анимацию и вызвать GetCurrentTime() из раскадровки класса, я не мог заставить его работать ...

Что бы вы сделали?

+2

интересно, так как эта страница указывает, что она существует - http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.startnew(v=VS.95).aspx –

+0

@James Это действительно очень интересно. Либо эта страница находится там по ошибке, либо, может быть, она подходит к SL5. Этот пост предполагает, что вы можете ссылаться на dll WP7 и использовать этот класс секундомера. Однако я не пробовал. 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.boolean% 28v = VS.95% 29.aspx –

ответ

2

Есть несколько вещей, которые вы могли бы сделать с этим. Кулак использует что-то вроде Environment.TickCount как человек here. Однако то, что, я думаю, может работать лучше, - использовать DispatcherTimer.

Чтобы настроить DispatcherTimer для работы как секундомера, нам также понадобится связанный с ним TimeSpan, представляющий время его запуска. Мы можем создать экземпляр DispatcherTimer и установить интервал, который он имеет время, и обработчик для события 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); 
} 

В интерфейсе мы можем создать что-то простое, чтобы начать и остановить наш таймер, а также отображать данные секундомера:

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

Теперь все, что осталось обработчики событий.
Обработчик OnTimerTick будет увеличивать и отображать наши данные секундомера.
Наш стартовый обработчик позаботится о том, чтобы инициализировать/усовершенствовать наш 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. И две статьи об этом: here и here. Модель анимации 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)); 

Все, что вам нужно сделать, это держать одну длинную переменную проведения общих тиков перед началом целевой задачи.

+0

хорошее простое решение, я фанат. – themaestro

+1

Используйте 'DateTime.UtcNow', если вы действительно не заботитесь о часовых поясах и т. Д. – Yaur

Смежные вопросы