Если вы используете .NET 4 (если не заменяете Task на Thread), функция, подобная этой, может быть началом:
private void slideToDestination(Control destination, Control control, int delay, Action onFinish)
{
new Task(() =>
{
int directionX = destination.Left > control.Left ? 1 : -1;
int directionY = destination.Bottom > control.Top ? 1 : -1;
while (control.Left != destination.Left || control.Top != destination.Bottom)
{
try
{
if (control.Left != destination.Left)
{
this.Invoke((Action)delegate()
{
control.Left += directionX;
});
}
if (control.Top != destination.Bottom)
{
this.Invoke((Action)delegate()
{
control.Top += directionY;
});
}
Thread.Sleep(delay);
}
catch
{
// form could be disposed
break;
}
}
if (onFinish != null) onFinish();
}).Start();
}
Использование:
slideToDestination(sender as Control, panel1, 10, () => MessageBox.Show("Done!"));
slideToDestination(sender as Control, panel1, 0, null);
Asдействие, которое вы бы отправили некоторой логической переменной для установки в true, чтобы вы знали, что анимация закончилась или какой-то код для запуска после нее.Остерегайтесь тупиков при вызове с нулевым действием.Вы можете запустить две анимации на одном и том же элементе управления в двух разных направлениях с одинаковой скоростью, и он останется на прежнем уровне, и, конечно, две анимации одновременно могут заставить элемент управления двигаться бесконечно в каком-то направлении, потому что время никогда не закончится1007 *