Называть DispatcherTimer на основе строки из другого метода? - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь сгенерировать 16 уникальных DispatcherTimers, без необходимости заново создавать код для каждого. Однако я не могу понять, как их динамически называть на основе содержимого, преобразованного в строку нажатой кнопки.

Первоначально я настраивал каждый таймер индивидуально, но это оказалось слишком большим количеством кода для поддержки. Теперь у меня есть метод, который срабатывает при нажатии одной из 16 кнопок, который устанавливает строку для содержимого кнопки и передает ее второму методу для настройки таймера диспетчера.

Я не могу просто назвать таймер в методе нажатия кнопки и передать его, поскольку он говорит мне, что он уже используется во внешней области для определения локального или параметра. Я попытался назвать таймер, связав строку «таймер» в конце имени переменной, но мне это не понравилось.

После нажатия кнопки

        public void StartBtnClicked(object sender, RoutedEventArgs e)
        {
            string btn = (sender as Button).Content.ToString();
            string timerName = btn + "timer";
            DispatcherTimerSetup(btn);
        }

Настройка таймера

        public void DispatcherTimerSetup(string passedBtn)
        {
            DispatcherTimer passedBtn + "Timer" = new DispatcherTimer();
        }

Моя цель сейчас состоит в том, чтобы таймеры назывались как «Button1ContentTimer». Я буду использовать таймеры для запуска событий после завершения, и у них будут разные временные промежутки. Я также буду реализовывать кнопку запуска / остановки всех, поэтому я называю каждую из них, поэтому я могу вызвать их всех сразу в методах запуска / остановки всех.

Edit:

Я сейчас создаю таймеры и добавляю их в словарь. Все таймеры названы одинаково, но включенная в них строка будет отличаться.

        public void DispatcherTimerSetup(string btn)
        {
            Dictionary<string, DispatcherTimer> timerDict =
                new Dictionary<string, DispatcherTimer>(); //Set up a dictionary to house all the timers in

            DispatcherTimer timer = new DispatcherTimer();

            try
            {
                timerDict.Add(btn, timer);
            }
            catch (ArgumentException)
            {
                MessageBox.Show("This timer is already running");
            }
        }

Метод StopAll будет получать словарь и повторять его для каждого таймера внутри.


        static public void StopAll(Dictionary<string, DispatcherTimer> timerDict)
        {
            foreach(KeyValuePair<string,DispatcherTimer> entry in timerDict)
            {

            }
        }

Мой единственный оставшийся вопрос - как остановить эти таймеры? Ранее я бы просто вызвал timerName.Stop (); несколько раз, с другим именем таймера для каждого таймера.

Но теперь, когда все таймеры названы одинаково и в словаре, я не могу понять, как получить к ним доступ. Я попробовал:

        static public void StopAll(Dictionary<string, DispatcherTimer> timerDict)
        {

            foreach(KeyValuePair<string,DispatcherTimer> entry in timerDict)
            {
                timerDict.Remove(DispatcherTimer);
            }
        }

, но он говорит мне, что DispatcherTimer - это тип, который недопустим в данном контексте. Я даже не уверен, что удаление его из словаря - это правильно, остановит ли это? Или мне нужно подходить к этому по-другому? Я чувствую, что должен быть способ на самом деле вызывать каждый элемент DispatcherTimer из словаря последовательно, но я пока не смог выяснить это.

1 Ответ

2 голосов
/ 08 мая 2019

Вот ссылки на документацию:

Словарь

DispatcherTimer

Чтобы остановить таймеры, вы можете сделать что-нибудькак это.Обратите внимание, что простое удаление таймера из словаря не останавливает его.

static public void StopAll(Dictionary<string, DispatcherTimer> timerDict)
{
    foreach(var timer in timerDict.Values) timer.Stop();
    timerDict.Clear();
}

static public void StopTimer(string TimerName, Dictionary<string, DispatcherTimer> timerDict)
{
    if (timerDict.ContainsKey(TimerName)
    {
        timerDict[TimerName].Stop();
        timerDict.Remove(TimerName);
    }        
}
...