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」、2番目は「10」です。最初のボタンをクリックすると、最初のボックスで「d1」が時間のカウントダウンを開始します。「10」になったら、先ほどと同じように2番目のボタンをクリックします。同じ間隔で 2 番目のボックス内のテキストをカウントダウンする "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;
}

それとは別に、あなたのコードがどこで間違っているのかわかりません。textBoxes の一方または両方に「xyz_Changed」イベントがあるかどうかを確認できます。これは、両方が同じ値を表示するように処理されます。おそらく、両方を簡単に取得して同じ開始値などを表示するためにこれを使用したのでしょう。

私が提案できる唯一の他のことは、これまでに持っている完全なコードを投稿できることです。

于 2013-02-06T08:46:15.250 に答える