WPF中动画完成后无法设置属性

4
我使用了以下代码来给我的窗口添加动画效果:
winLogin login = new winLogin();
login.Owner = this;
login.Show();

DoubleAnimation da = new DoubleAnimation();
da.From = 0;
da.To = this.Left + ((this.Width - login.Width) / 2);
da.AutoReverse = false;
da.Duration = new Duration(TimeSpan.FromSeconds(0.1));
login.BeginAnimation(Window.LeftProperty, da);

问题是每当我设置此窗口的Left属性(动画后),它就会失控。
我使用了这段代码来使子窗口始终居中对齐,但在我使用动画的窗口上,Left属性无法正确更改。
private void Window_LocationChanged(object sender, EventArgs e)
{
        foreach (Window win in this.OwnedWindows)
        {
            win.Top = this.Top + ((this.Height - win.Height) / 2);
            win.Left = this.Left + ((this.Width - win.Width) / 2); 
        }
}
1个回答

7
首先,在设置动画时,您应该始终删除该属性的潜在先前动画:
login.BeginAnimation(Window.LeftProperty, null);
login.BeginAnimation(Window.LeftProperty, da);

如果你不这样做,就会出现内存泄漏和其他一些不期望的行为。
此外,由于DependencyProperty 优先级的原因,您无法在具有活动动画的 DependecyProperty 上设置值,这在您的动画中是成立的,因为它的FillBehavior设置为 HoldEnd(默认值)。同样,您必须首先删除动画。

实际上,使用SetCurrentValue设置值也可以,不过动画仍然会优先于HoldEnd。 - Alex Paven
新的.NET 4 DependencyObject.SetCurrentValue 用于在不影响数据绑定源值的情况下设置数据绑定DependencyProperties上的值。然而,您的Window.LeftProperty并没有进行数据绑定。动画会直接设置该属性的值。 - bitbonk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接