Один диспетчерский таймер, перемещение нескольких элементов C # wpf - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь использовать DispatcherTimer для нескольких элементов (визуальный, движущаяся панель стека)

Можно ли назвать один и тот же DispatcherTimer_Tick для нескольких элементов?и все они двигаться одновременно, но с помощью петли?А также как мне отложить таймер диспетчера для создания нового отряда через некоторое время?

на данный момент у меня нет ничего подобного

for (int i = 1; i < 3; i++)
{
    dispatcherTimer = new DispatcherTimer();
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
    dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 1);
    index = i;
    FirstTroop(i);
    dispatcherTimer.Start();
}     

1 Ответ

0 голосов
/ 03 июня 2018

Можно ли вызывать один и тот же DispatcherTimer_Tick для нескольких элементов?

Да, вы можете вызывать dispatcherTimer_Tick(null, null) в любом месте вашего кода.Но рекомендуется оставлять обработчик событий только для обработки тиковых событий и вместо этого вызывать более значимый метод для этой цели.как SpawnTroop:

dispatcherTimer_Tick(object sender, EventArgs e)
{
    SpawnFirstTroop();
}

и все они перемещаются одновременно, но с использованием цикла?

Так что вам нужно позвонить dispatcherTimer_Tick внутри цикла.

void Start()
{
    dispatcherTimer = new DispatcherTimer();
    dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
    dispatcherTimer.Interval = TimeSpan.FromMilliseconds(1000);
    dispatcherTimer.Start();
}

dispatcherTimer_Tick(object sender, EventArgs e)
{
    for (int i = 1; i < 3; i++)
    {
        SpawnTroop(i);
    }  
}

А также, как я должен отложить таймер диспетчера для создания нового отряда через некоторое время?

Согласно MSDN:

Если в приложении WPF используется System.Timers.Timer, стоит отметить, что System.Timers.Timer работает в другом потоке, чем поток пользовательского интерфейса (UI).Чтобы получить доступ к объектам в потоке пользовательского интерфейса (UI), необходимо опубликовать операцию в диспетчере потока пользовательского интерфейса (UI) с помощью Invoke или BeginInvoke.Причины использования DispatcherTimer в отличие от System.Timers.Timer заключаются в том, что DispatcherTimer работает в том же потоке, что и Dispatcher, и DispatcherPriority может быть установлен в DispatcherTimer.

Для этого существует несколько решений:

  1. Вы не можете использовать Thread.Sleep с dispatcherTimer_Tick.Но вы можете использовать Thread.Sleep с Timer для задержки внутри обработчика тиковых событий таймера.

  2. Вы можете написать больше кода для вашего dispatcherTimer, чтобы включить два интервала (например, простой целочисленный счетчик)в обход обработчика событий).этот подход не рекомендуется.

  3. Вы можете использовать два таймера диспетчера, один для постановки в очередь / запроса новых объектов, один для создания / отображения их.

...