这个问题的示例代码是关于动画化
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);
}
}
XAML:
<Window x:Class="WpfAppAnimatedWindowMove.MainWindow"
// [...]
Name="myWindow">
Result:
https://imgur.com/a/OZEsP6t
另请参阅Microsoft Docs中的Remarks部分 - HandoffBehavior枚举。
Storyboard sb = new Storyboard(); DoubleAnimation da_AngleAnimation = new DoubleAnimation(); Duration duration = new Duration(TimeSpan.FromSeconds(1)); da_AngleAnimation.Duration = duration; da_AngleAnimation.From = 1920; da_AngleAnimation.To = 100; sb.Duration = duration; sb.BeginAnimation(Window.LeftProperty, da_AngleAnimation);
它不起作用。我哪里做错了吗? - Raj