Я пытаюсь сгенерировать 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 из словаря последовательно, но я пока не смог выяснить это.