2

在这里,我将时间变量初始化为 0,并用于StopWatch计算毫秒数并DispatcherTimer更新 UI

Imports System.Threading
Imports Windows.UI.Xaml

Dim dt As DispatcherTimer = New DispatcherTimer
Dim dd As Integer = 0
Dim mm As Integer = 0
Dim hh As Integer = 0
Dim ss As Integer = 0
Dim ms As Integer = 0
Dim stopwatch As System.Diagnostics.Stopwatch = New System.Diagnostics.Stopwatch

Private Sub ontimertick()
        ms = stopwatch.ElapsedMilliseconds
        ss = ms / 1000
        ms = ms Mod 1000
        mm = ss / 60
        ss = ss Mod 60
        hh = mm / 60
        mm = mm Mod 60
        dd = hh / 24
        hh = hh Mod 24
        MicroSeconds.Text = ms.ToString("00")
        Seconds.Text = ss.ToString("00")
        Minutes.Text = mm.ToString("00")
        Hours.Text = hh.ToString("00")


    End Sub

Private Sub StartButton_Click(sender As Object, e As RoutedEventArgs) Handles StartButton.Click

dt.Interval = New TimeSpan(0, 0, 0, 0, 100)
AddHandler dt.Tick, AddressOf ontimertick
stopwatch.Start()
dt.Start()

End Sub

问题是所有变量的第一个实例的增量时间是我预期的实际时间的 1/2。

例如 seconds.text 在第 500 毫秒更新为 1,下一个在 1000 毫秒后更新

同样,Minutes.text 在第 30 秒后更新为 1,然后在 60 秒后正常递增

与小时和天相同,但仅在第一个实例之后,它在正常间隔后递增

那么任何人都可以帮我找出逻辑错误吗?


我想知道如何反转过程并倒计时?

你们能帮我解决我可以实现的想法/逻辑吗?

4

2 回答 2

2

我认为你做的工作比你需要的要多。该Stopwatch.Elapsed属性返回 a TimeSpan,其中包含已用时间的所有各个部分。

ontimertick()可能看起来像这样:

Private Sub ontimertick()
    TimeSpan e = stopwatch.Elapsed
    MicroSeconds.Text = e.Milliseconds.ToString("00")
    Seconds.Text = e.Seconds.ToString("00")
    Minutes.Text = e.Minutes.ToString("00")
    Hours.Text = e.Hours.ToString("00")
End Sub
于 2012-09-18T18:36:39.947 回答
2
   ss = ms / 1000

/运算符执行浮点除法,产生 Double 结果。然后您将其分配给一个整数,这将入该值而不是像您希望的那样截断它。所以 500/1000 变成 1。

解决方法是使用整数除法运算符:

   ss = ms \ 1000

也适用于其他部门。

于 2012-09-19T01:01:50.257 回答