银光计时器?

22

Silverlight没有StopWatch。

那么你会用什么替代它呢?

我看到一些帖子上的人说要创建一个空动画,并从Storyboard类调用GetCurrentTime(),但我无法让它工作...

你会怎么做?


2
有趣的是,这个页面似乎表明它存在 - http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.startnew(v=VS.95).aspx - James Manning
@James,确实非常有趣。那个页面可能只是错误的存在,或者它可能会出现在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.boolean%28v=VS.95%29.aspx。 - Luke Woodward
4个回答

24

这是我做的。它很简单并且对我非常有效:

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
除非您真正关心时区等问题,否则请使用 DateTime.UtcNow - Yaur

6
请点击这里查看我的手表。源代码请点击这里。关于此手表的两篇文章分别在这里这里。Silverlight动画模型非常适合用来制作秒表。

alt文本 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));
}

我不确定这对问题有多大帮助,但非常好! - Aardvark

4

这里有一个可以添加到你的项目中的秒表替代类,点击此处查看。


谢谢分享,实现得很棒 :D - Dr. Andrew Burnett-Thompson

2
这里有几件事情可以做。第一种方式是使用类似于这个人所提到的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();
 }

我尝试使用相同的方法,但结果不正确。可能是由于函数开销或硬件问题,应用程序中的时间比实际挂钟慢。您能否帮忙修复这个问题? - letsc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接