日期:2014-05-17  浏览次数:20932 次

WPF,动画的IsAdditive属性和属性值的优先级
第一段代码:

DoubleAnimation widthAnimation = new DoubleAnimation();
widthAnimation.From = 75;
widthAnimation.To = 130;
widthAnimation.Duration = TimeSpan.FromSeconds(0.5);
button1.BeginAnimation(Button.WidthProperty, widthAnimation);
button1.Width = 300;


这段代码当动画执行完之后,Width属性值为130,最后一句不会起作用,因为动画的属性值的优先级高

第二段代码:

DoubleAnimation widthAnimation = new DoubleAnimation();
widthAnimation.From = 75;
widthAnimation.To = 130;
widthAnimation.Duration = TimeSpan.FromSeconds(0.5);
widthAnimation.IsAdditive = true;
button1.BeginAnimation(Button.WidthProperty, widthAnimation);
button1.Width = 300;


第二段代码,设置了IsAdditive 属性为true,为什么最后设置Width的代码起作用了呢?IsAdditive属性能改变优先级吗?

------解决方案--------------------
我验证了一下,这确实是一个很奇怪的问题。
至于第二段代码,button的宽度只有在大于动画后的button的长度的时候,而且是第一次才起作用。
即,假如button1.width=50;那么是看不到效果的。
即使改成button1.Width+=300;也只有在第一次动画执行后才有效果。第二,三次就没有效果了。

我觉得第二段代码的情况不正常,难道是bug?
------解决方案--------------------
第一个问题,是由于“动画”没有停止,详情请看:
http://msdn.microsoft.com/en-us/library/aa970493%28v=vs.100%29.aspx
里面提到的其中一个停止动画的办法是:

button1.BeginAnimation(Button.WidthProperty, null);
//这样Width就会有变化了
button1.Width = 300;



------解决方案--------------------
对于第二个问题,DoubleAnimation.IsAdditive属性的解释是:
获取或设置一个值,该值指示是否应将目标属性的当前值此动画的起始值相加。

------解决方案--------------------
引用:
对于第二个问题,DoubleAnimation.IsAdditive属性的解释是:
获取或设置一个值,该值指示是否应将目标属性的当前值此动画的起始值相加。


晕死,没打完就按错回复了。。。接着说。。。

==================================================================
我的理解是,既然设置为true,即动画值与目标属性值就需要“互动”,动画值自然不能覆盖目标属性值(overriding the base value),这里的理解是根据2楼那msdn的内容写的