Я бы посоветовал вам использовать Таймер .Существуют и другие варианты, но это будет самый простой способ, если вы хотите избежать проблем с многопоточностью и т. Д.
Использование прямого цикла потребует откачки очереди сообщений с помощью Application.DoEvents()
, чтобы обеспечить возможность для оконфактически отобразить обновленный элемент управления, в противном случае цикл for будет выполняться до завершения без обновления пользовательского интерфейса, и элемент управления будет отображаться для перехода из исходного местоположения в целевое местоположение.
Вот пример QAD для анимации кнопки внаправление Y при нажатии.Этот код предполагает, что вы помещаете элемент управления таймером в форму, называемую animationTimer
.
private void button1_Click(object sender, EventArgs e)
{
if (!animationTimer.Enabled)
{
animationTimer.Interval = 10;
animationTimer.Start();
}
}
private int _animateDirection = 1;
private void animationTimer_Tick(object sender, EventArgs e)
{
button1.Location = new Point(button1.Location.X, button1.Location.Y + _animateDirection);
if (button1.Location.Y == 0 || button1.Location.Y == 100)
{
animationTimer.Stop();
_animateDirection *= -1; // reverse the direction
}
}