Секундомер для серебряного света?
Для Silverlight нет StopWatch.
Что бы вы использовали вместо него?
Я видел несколько сообщений о людях, говорящих, чтобы создать пустую анимацию и вызвать GetCurrentTime() из класса Storyboard, я не мог заставить его работать...
Что бы вы сделали?
Ответы
Ответ 1
Это то, что я сделал. Он прост и очень хорошо работал у меня:
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));
Все, что вам нужно было сделать, это сохранить одну длинную переменную, удерживающую общие тики перед началом целевой задачи.
Ответ 2
Смотрите мои часы на здесь. Исходный код здесь. И две статьи об этом здесь и здесь. Модель анимации 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));
}
Ответ 3
Ниже приведен список Секундомер, который вы можете добавить в свой проект.
Ответ 4
Есть несколько вещей, которые вы могли бы сделать с этим. Кулак использует что-то вроде Environment.TickCount, как человек здесь. Тем не менее, что-то, что, я думаю, может работать лучше, это использовать 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();
}