1

我想创建几个计时器,倒计时 x 时间,独立工作,更新 textBlock 中的时间,并在完成后做一些事情。

所以我写道:

private DispatcherTimer d1, blueTimer;

private void but1_Click(object sender, RoutedEventArgs e)
{
    if (redTimer == null)
    {
        d1 = new System.Windows.Threading.DispatcherTimer();
        d1.Tick += new EventHandler(d1_Tick);
        d1.Interval = new TimeSpan(0, 0, 1);
        d1.Start();
    }
}

private void but2_Click(object sender, RoutedEventArgs e)
{
    if (d2 == null)
    {
        d2 = new System.Windows.Threading.DispatcherTimer();
        d2.Tick += new EventHandler(d2_Tick);
        d2.Interval = new TimeSpan(0, 0, 1);
        d2.Start();
    }
}

private void d1_Tick(object sender, EventArgs e)
{
    int time = string2time(t1.Text);
    if (time > 0)
    {
        t1.Text = time2string(--time);
    }
    else
    {
        d1.Stop();
    }
}

private void d2_Tick(object sender, EventArgs e)
{
    int time = string2time(t2.Text);
    if (time > 0)
    {
        t2.Text = time2string(--time);
    }
    else
    {
        d2.Stop();
    }
}

时间例如是15秒。当我点击but1时,时间正在倒计时,当t1为10秒时,我点击but2,t2也是10秒,倒计时时间相同。

为什么会这样?如何避免这种情况?

4

1 回答 1

0

Sry 误读了代码。会再看一遍。

你能发布“string2time”和“time2string”的代码吗?

还要检查您的实际代码是否与您发布的代码相同:

private DispatcherTimer d1, blueTimer;    // <-- d1 and blueTimer? blueTimer is never 
                                          //mentioned. However a "redTimer" object appears in your code

private void but1_Click(object sender, RoutedEventArgs e)
{
    if (redTimer == null)   // <-- shouldn´t this be "(d1 == null)"?
    {
        d1 = new System.Windows.Threading.DispatcherTimer();
        d1.Tick += new EventHandler(d1_Tick);
        d1.Interval = new TimeSpan(0, 0, 1);
        d1.Start();
    }
}

private void but2_Click(object sender, RoutedEventArgs e)
{
    if (d2 == null)
    {
        d2 = new System.Windows.Threading.DispatcherTimer();
        d2.Tick += new EventHandler(d2_Tick);
        d2.Interval = new TimeSpan(0, 0, 1);
        d2.Start();
    }
}

我不确定问题是什么。据我所知,您有 2 个输入时间的文本框。在您的示例中,第一个读取“15”,第二个读取“10”。现在单击第一个按钮,“d1”开始倒计时第一个框中的时间。当它达到“10”时,与另一个一样,单击第二个按钮。以“d2”开头,然后以相同的间隔倒计时第二个框中的文本。如果这是正在发生的事情,那么代码正在做它应该做的事情吗?或者你想达到什么效果。没有把握。

请澄清问题。

编辑:

你可以简化这个:

private string time2string(int time) 
{
    string stime = "";
    int m, s = 0;

    m = time / 60;
    //s = time - m * 60;
    s = time % 60;  // this is a modulo, it will divide the number by 60 and provide the 
                    // rest. Learn to use it, it may save you a lot of work sometimes.

    //stime = m < 10 ? "0" + m.ToString() : m.ToString();
    //stime += ":" + (s < 10 ? "0" + s.ToString() : s.ToString());
    stime = string.Format("{0:D2}:{1:D2}", m, s};    // does the same as the two previous lines
    return stime;
}

除此之外,我也看不出您的代码哪里出错了。您可以检查一个或两个文本框是否具有“xyz_Changed”事件,该事件的处理方式使两者都显示相同的值。也许您使用它是为了便于让两者显示相同的起始值或其他东西。

我唯一可以建议的另一件事是您可以发布到目前为止的完整代码。

于 2013-02-06T08:46:15.250 回答