1

3つのボタン(Button1、Button2、StartButton)とタイマーを備えたwin8アプリを構築しています。Button1とButton2は無効になっています。StartButtonをクリックすると、Button1が有効になり、20秒以内のクリック数がカウントされ、textblock1に表示されます。タイマーが終了すると、Button1が無効になり、Button2が有効になり、クリック数がカウントされ、textblock2に表示されます。私の問題は、タイマーがButton2ではなくButton1に対して適切に作動することです。button2を有効にすると、タイマーが速くなります。誰かが私を助けることができますか?私のコードは以下の通りです:

    private int count1=0;
    private int count2=0;
    private int clickCounter = 0;
    private int timeLeft;
    private DispatcherTimer timer;

    private void StartTimer()
    {
        if (this.timer != null)
        {
            this.StopTimer();
        }
        DispatcherTimer timer = new DispatcherTimer();
        timer.Interval = new TimeSpan(0,0,0,1);
        timer.Tick += timer_Tick;
        timer.Start();

    }

    private void StopTimer()
    {
        if (this.timer != null)
        {
            this.timer.Stop();
            this.timer = null;
        }
    }

    public void timer_Tick(object sender, object args)
    {

        if (timeLeft > 0)
        {
            timeLeft = timeLeft - 1;
            timerTextBlock.Text = Convert.ToString(timeLeft);
            this.StartButton.IsEnabled = false;
        }
        else
        {
            StopTimer();
            if (clickCounter==2)
            {
                ShowResult();
                this.Button2.IsEnabled = false;
                this.StartButton.IsEnabled = false;
            }
            else
            {
                myMsg.Text = "Time's up!";
                this.Button1.IsEnabled = false;
                this.StartButton.IsEnabled = true;
            }
        }
    }

    private void Button1_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
    {
        // TODO: Add event handler implementation here.
        count1++;
        this.textblock1.Text=count1.ToString();

    }

    private void Button2_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
    {
        count2++;
        this.textblock2.Text=count2.ToString();
    }
    public void ResetTimer()
    {
            timeLeft = 20;
    }
    private void StartButton_Click(object sender, RoutedEventArgs e)
    {
        clickCounter++;
        if (textblock1.Text == "0")
        {
            ResetTimer();
            StartTimer();
            this.Button1.IsEnabled = true;
        }
        else
        {
            ResetTimer();
            StartTimer();
            this.Button2.IsEnabled = true;
        }
    }
4

1 に答える 1

3

StartTimerメソッドを呼び出すたびにtimer.Tick += timer_Tick;実行されます。つまりStartTimer、2回目に呼び出すと、ティックごとに2つのイベントが呼び出されます。次のようにコードを分割します。

private void InitTimer()
{
    timer = new DispatcherTimer();
    timer.Interval = new TimeSpan(0,0,0,1);
    timer.Tick += timer_Tick;
}

private void StartTimer()
{
    timer.Start();
}

InitTimerを1つだけ呼び出します。もう1つのオプションはif (this.timer != null)、コードを使用してイベントの登録を解除することです。2つ目のポイントは、名前の競合です。メソッドtimer.Tick -= timer_Tick; にプライベートグローバル変数タイマーと1つの変数タイマーがあります。StartTimer

//編集:完全に更新されたコード:

private int count1=0;
private int count2=0;
private int clickCounter = 0;
private int timeLeft;
private DispatcherTimer timer;

private void StartTimer() {
    if (timer == null) {
        timer = new DispatcherTimer();
        timer.Interval = new TimeSpan(0,0,0,1);
        timer.Tick += timer_Tick;
    }
    timer.Stop();
    timeLeft = 20;
    timer.Start();
}

public void timer_Tick(object sender, object args) {
    if (timeLeft > 0) {
        timeLeft = timeLeft - 1;
        timerTextBlock.Text = Convert.ToString(timeLeft);
    } else {
        timer.Stop();
        if (clickCounter==2) {
            ShowResult();
            Button2.IsEnabled = false;
            StartButton.IsEnabled = false;
        } else {
            myMsg.Text = "Time's up!";
            Button1.IsEnabled = false;
            StartButton.IsEnabled = true;
        }
    }
}

private void Button1_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e) {
    count1++;
    textblock1.Text=count1.ToString();
}

private void Button2_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e) {
    count2++;
    textblock2.Text=count2.ToString();
}

private void StartButton_Click(object sender, RoutedEventArgs e) {
    clickCounter++;
    StartButton.IsEnabled = false;
    if (textblock1.Text == "0"){
        Button1.IsEnabled = true;
        StartTimer();
    } else {
        Button2.IsEnabled = true;
        StartTimer();
    }
}
于 2012-05-08T11:18:46.910 に答える