问题的示例代码是关于动画Window.Left
属性的,我正在寻找确切的情况,但给定的答案仅适用于一次性用例。
具体来说:如果动画已经执行,然后通过拖放手动移动窗口,则相同的动画过程将无法按需要再次运行。动画将始终使用最近动画运行的结束坐标。
所以如果你移动了窗口,它会在开始新动画之前跳回来:
https://imgur.com/a/hxRCqm7
要解决该问题,需要AnimationClock
在动画完成后从动画属性中删除任何内容。
这是通过使用ApplyAnimationClock
or BeginAnimation
withnull
作为第二个参数来完成的:
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 Enum 的备注部分