Проблема с событием тика класса DispatcherTimer

Я не знаю, как объяснить это ясно, но я постараюсь изо всех сил. Я использую класс DispatcherTimer в своем проекте Windows Phone 8. У меня есть несколько флажков, и когда флажок установлен и нажата кнопка, начинается обратный отсчет от расписания автобусов. Здесь все работает отлично, но когда я снимаю флажок и устанавливаю другой, начинается одно и то же время автобуса, и теперь оно уменьшается (обратный отсчет) на 2 секунды. Если я снимаю флажок и снова устанавливаю другой, начинается обратный отсчет того же времени, и обратный отсчет идет на 3 секунды ... Я не понимаю, как это сделать, потому что на click_event всегда есть новый экземпляр класса. Единственное, что решает проблему, это перезагрузить мою страницу wp8 и снова что-то проверить и нажать кнопку для запуска обратного отсчета. Примечание. Я читаю свое время из файла .txt, который хранится в папке в моем проекте (используя streamreader). Какие-либо предложения?

Вот код:

 CheckBox[] listchekbox;
 DispatcherTimer timer;
    private void Button_Click(object sender, RoutedEventArgs e)//BUTTON CLICK
    {
         timer = new DispatcherTimer();

        listchekbox = new CheckBox[4] { Check1, Check2, Check3, Check4 };
        if (Onlyoneclick(listchekbox, 0)) { Gettingbustime(path_names[0]); }
        else if (Onlyoneclick(listchekbox, 1)) { Gettingbustime(path_names[1]); }


        timer.Interval = new TimeSpan(0,0,1);
        timer.Tick += onclick;
        timer.Start();


    }

    private void onclick(object sender, EventArgs e) // TIMER EVENT COUNT
    {

        Countdown(bus1); // the parameter is the textbox where the result is displayed
        Countdown(bus2);
    }
    private bool Onlyoneclick(CheckBox[] itemselected,int id) // this is not so important
    {
        int itemcounter = 0;
        int falsecounter = 0;
        for (int i = 0; i < listchekbox.Length; i++)
        {
            if (itemselected[i].IsChecked == true && id == i)
            {
                itemcounter++;
            }
            else if (itemselected[i].IsChecked == true) { falsecounter++; }
        }
        if (itemcounter == 1 && falsecounter==0) { return true; }
        else { return false; }

    }
    public void Countdown(TextBlock tx) 
    {

        string minute = tx.Text.Substring(0, 2);
        string sekunde = tx.Text.Substring(3, 2);
        int minute1 = Convert.ToInt32(minute);
        int sekunde1 = Convert.ToInt32(sekunde);

        sekunde1 = sekunde1 - 1;
             if (sekunde1 < 0) 
             {
                 minute1 = minute1 - 1;
                 sekunde1 = 59;

             }
             if (minute1 < 0) 
             {

                 timer.Stop();

                 MessageBox.Show("Autobus left!");
             }
             if (sekunde1 < 10) { tx.Text = minute1.ToString() + ":0" + sekunde1.ToString(); }
             else { tx.Text = minute1.ToString() + ":" + sekunde1.ToString(); }

             if (minute1 < 10) { tx.Text = "0" + minute1.ToString() + ":" + sekunde1.ToString(); }

             if (minute1 < 10 && sekunde1 < 10) { tx.Text = "0" + minute1.ToString() + ":0" + sekunde1.ToString(); }

    }

person Eugen Sunic    schedule 07.08.2014    source источник
comment
Вы создаете новый таймер, вы не остановили старый. Он продолжает тикать.   -  person Hans Passant    schedule 07.08.2014
comment
Я сделал, но это не показано в коде. Кажется, что класс таймера должен быть создан только один раз, в начальном конструкторе класса, это только решает проблему, хотя я не уверен, почему   -  person Eugen Sunic    schedule 07.08.2014


Ответы (1)


Попробуйте удалить этот код из Button_Click:

timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0,0,1);
timer.Tick += onclick;

И добавьте его вместо этого в свой конструктор.

person Muster Station    schedule 07.08.2014
comment
Я не верю, что это решило мою проблему!!! Я приму ваш ответ, как только смогу. - person Eugen Sunic; 07.08.2014