Вы путаете несколько вещей здесь.
Во-первых, анимация не будет работать вечно только потому, что вы не установили ее продолжительность. Вместо этого продолжительность DoubleAnimation по умолчанию равна 1 секунде, затем она останавливается.
Во-вторых, свойство To
анимации волшебным образом не изменится только потому, что вы изменили переменную, которой вы ее предварительно присвоили. Изменения свойств анимации будут игнорироваться в любом случае после ее запуска.
Я думаю, что использование анимации - неправильный подход к решению вашей проблемы. То, чего вы хотите достичь (непрерывно движущийся объект с изменяемым вектором скорости), возможно, лучше всего сделать, используя DispatcherTimer и циклически обновляя положение объекта в соответствии с прошедшим временем.
Следующий пример кода может дать вам представление о том, как это работает. Теперь вы можете изменить вектор скорости по своему усмотрению (установив speed.X
и speed.Y
несколькими нажатиями кнопок), и объект будет двигаться соответствующим образом. Возможная оптимизация состояла бы в том, чтобы не запускать таймер немедленно, а только тогда, когда вектор становится ненулевым, и останавливать его снова, когда скорость становится равной нулю.
private DispatcherTimer timer = new DispatcherTimer(); // timer object
private Vector speed = new Vector(0, 0); // movement in pixels/second, initially zero
public MainWindow()
{
InitializeComponent();
timer.Interval = TimeSpan.FromMilliseconds(50); // update 20 times/second
timer.Tick += TimerTick;
timer.Start();
}
private void TimerTick(object sender, EventArgs e)
{
// movement in one interval
double dx = speed.X * timer.Interval.TotalSeconds;
double dy = speed.Y * timer.Interval.TotalSeconds;
// update position
Canvas.SetLeft(el, Canvas.GetLeft(el) + dx);
Canvas.SetTop(el, Canvas.GetTop(el) + dy);
}