Повторно активировать кнопку после того, как таймер обнуляется - PullRequest
0 голосов
/ 22 марта 2020

Нужна ваша помощь с кнопкой. Его повторное включение после того, как таймер обнуляется. Тем не менее, он снова включается после того, как я нажму UI или кнопку, и таймер будет нулевым. Любые идеи? Спасибо.

Вот команда:

        RelayCommand _testCommand;
        public ICommand TestCommand
        {
            get
            {
                if (_testCommand == null)
                {
                    _testCommand = new RelayCommand(
                        (object o) =>
                        {
                            IsEnabled = false;
                            StartTimer(5);
                        }, (object j)=> IsEnabled );
                }
                return _testCommand;
            }
            set { _testCommand = null; }
        }

Вот свойство:

    bool _isEnabled = true;
    bool IsEnabled
    {
        get { return _isEnabled; }
        set
        {
            _isEnabled = value;
            OnPropertyChanged();

        }
    }

Методы:

    private Timer timer1;
    private int counter;
    private void StartTimer(int cnt)
    {
        counter = cnt;
        timer1 = new Timer();
        timer1.Elapsed += OnTimedEvent;
        timer1.Interval = 1000;
        timer1.Start();
    }

    private void OnTimedEvent(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine(counter);
        counter--;
        if (counter < 0)
        {
            timer1.Stop();
            IsEnabled = true;
        }            
    }

1 Ответ

0 голосов
/ 24 марта 2020

Хорошо. Я думаю, что ответил на свой вопрос. Поправь меня, если я ошибаюсь, но происходят две вещи. Одним из них является то, что ElapsedEventArgs выполняется в другом потоке. Два кнопки (UI) не обновляются автоматически. Я должен позвонить CommandManager.InvalidateRequerySuggested();, чтобы вызвать обновление. Обновлен метод OnTimedEvent:

    private void OnTimedEvent(object sender, ElapsedEventArgs e)
    {
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " " + counter);
        counter--;
        if (counter < 0)
        {
            Application.Current.Dispatcher.Invoke(() =>
            {
                IsEnabled = true;
                timer1.Stop();
                CommandManager.InvalidateRequerySuggested();
                Console.WriteLine("The caller id now is " + Thread.CurrentThread.ManagedThreadId);
            });
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...