Секундомер для серебряного света? - PullRequest
22 голосов
/ 23 мая 2009

Для Silverlight нет секундомера.

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

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

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

Ответы [ 4 ]

24 голосов
/ 06 января 2011

Это то, что я сделал. Это просто и работает очень хорошо для меня:

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

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

6 голосов
/ 24 мая 2009

Смотрите мои часы на здесь . Исходный код здесь . И две статьи об этом здесь и здесь . Анимационная модель Silverlight отлично подходит для секундомера.

альтернативный текст 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));
}
4 голосов
/ 07 декабря 2010

Вот класс замены Секундомер , который вы можете добавить в свой проект.

2 голосов
/ 23 мая 2009

Есть несколько вещей, которые вы можете сделать с этим. Во-первых, используйте что-то вроде 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 будет увеличивать и отображать данные нашего секундомера.
Наш обработчик 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();
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...