Пример кода вопроса касался анимации свойства Window.Left
, и я искал именно этот случай, но данный ответ работает только для одноразового варианта использования.
В частности: если анимация была выполнена, а окно затем перемещается вручную с помощью перетаскивания, та же процедура анимации не будет работать снова, как хотелось бы. Анимация всегда будет использовать конечные координаты последнего запуска анимации.
Поэтому, если вы переместите окно, оно отскочит назад перед запуском новой анимации:
https://imgur.com/a/hxRCqm7
Чтобы решить эту проблему, необходимо удалить все AnimationClock
из анимированного свойства после завершения анимации.
Это делается с помощью ApplyAnimationClock
или BeginAnimation
с null
в качестве второго параметра:
public partial class MainWindow : Window
{
// [...]
private void ButtonMove_Click(object sender, RoutedEventArgs e)
{
AnimateWindowLeft(500, TimeSpan.FromSeconds(1));
}
private void AnimateWindowLeft(double newLeft, TimeSpan duration)
{
DoubleAnimation animation = new DoubleAnimation(newLeft, duration);
myWindow.Completed += AnimateLeft_Completed;
myWindow.BeginAnimation(Window.LeftProperty, animation);
}
private void AnimateLeft_Completed(object sender, EventArgs e)
{
myWindow.BeginAnimation(Window.LeftProperty, null);
// or
// myWindow.ApplyAnimationClock(Window.LeftProperty, null);
}
}
XAML:
<Window x:Class="WpfAppAnimatedWindowMove.MainWindow"
// [...]
Name="myWindow">
Результат:
https://imgur.com/a/OZEsP6t
См. также раздел Примечания в Microsoft Docs — Перечисление HandoffBehavior
person
Martin Schneider
schedule
26.11.2019