对属性进行动画处理后设置该属性
2013-06-24 14:41 yangtam 阅读(470) 评论(1) 收藏 举报在最近做的项目中,发现一个棘手的问题:在经过动画处理后,那些属性值都无法改变了。在动画过程中,wpf不会马上显示属性的赋值结果,然后在动画结束后该属性被释放到初始值,即你设定的预期值,因为就是动画的结束值,所以你看不到变化,但是这时候的属性已经可以做改变了。
原来想详细写写这个问题,今天偶然发现MSDN上有:http://msdn.microsoft.com/zh-cn/library/aa970493.aspx。
这几个方法都可以实现我们需要的方式,贴一贴原文
【示例】
在下面的示例中,Storyboard 用于对 SolidColorBrush 的颜色进行动画处理。 当单击按钮时将触发演示图板。 处理 Completed 事件以便在 ColorAnimation完成时通知程序
<Button Content="Animate and Then Set Example 1"> <Button.Background> <SolidColorBrush x:Name="Button1BackgroundBrush" Color="Red" /> </Button.Background> <Button.Triggers> <EventTrigger RoutedEvent="Button.Click"> <BeginStoryboard> <Storyboard> <ColorAnimation Storyboard.TargetName="Button1BackgroundBrush" Storyboard.TargetProperty="Color" From="Red" To="Yellow" Duration="0:0:5" FillBehavior="HoldEnd" Completed="setButton1BackgroundBrushColor" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Button.Triggers> </Button>
在 ColorAnimation 完成之后,程序尝试将画笔的颜色改为蓝色
private void setButton1BackgroundBrushColor(object sender, EventArgs e) { // Does not appear to have any effect: // the brush remains yellow. Button1BackgroundBrush.Color = Colors.Blue; }
上面的代码似乎未起任何作用:画笔仍然保持为黄色,即对画笔进行动画处理的 ColorAnimation 所提供的值。 基础属性值(基值)实际上已改为蓝色。 但是,因为 ColorAnimation 仍然在重写基值,所以有效值(或者说当前值)仍保持为黄色。 如果需要将基值再次变为有效值,则必须禁止动画影响该属性。 使用演示图板动画,可以有三种方法实现此目标:
-
将动画的 FillBehavior 属性设置为 Stop
-
移除整个演示图板。
-
从单个属性移除动画。
将动画的 FillBehavior 属性设置为 Stop
通过将 FillBehavior 设置为 Stop,即通知动画在到达其活动期末尾后停止影响其目标属性。
<Button Content="Animate and Then Set Example 2"> <Button.Background> <SolidColorBrush x:Name="Button2BackgroundBrush" Color="Red" /> </Button.Background> <Button.Triggers> <EventTrigger RoutedEvent="Button.Click"> <BeginStoryboard> <Storyboard> <ColorAnimation Storyboard.TargetName="Button2BackgroundBrush" Storyboard.TargetProperty="Color" From="Red" To="Yellow" Duration="0:0:5" FillBehavior="Stop" Completed="setButton2BackgroundBrushColor" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Button.Triggers> </Button>
private void setButton2BackgroundBrushColor(object sender, EventArgs e) { // This appears to work: // the brush changes to blue. Button2BackgroundBrush.Color = Colors.Blue; }
移除整个演示图板
通过使用 RemoveStoryboard 触发器或 Storyboard.Remove 方法,通知演示图板动画停止影响其目标属性。 此方法与设置 FillBehavior 属性的不同之处在于:您可以在任何时候移除演示图板,而 FillBehavior 属性只有在动画到达其活动期末尾时才有效。
<Button Name="Button3" Content="Animate and Then Set Example 3"> <Button.Background> <SolidColorBrush x:Name="Button3BackgroundBrush" Color="Red" /> </Button.Background> <Button.Triggers> <EventTrigger RoutedEvent="Button.Click"> <BeginStoryboard Name="MyBeginStoryboard"> <Storyboard x:Name="MyStoryboard"> <ColorAnimation Storyboard.TargetName="Button3BackgroundBrush" Storyboard.TargetProperty="Color" From="Red" To="Yellow" Duration="0:0:5" FillBehavior="HoldEnd" Completed="setButton3BackgroundBrushColor" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Button.Triggers> </Button>
private void setButton3BackgroundBrushColor(object sender, EventArgs e) { // This appears to work: // the brush changes to blue. MyStoryboard.Remove(Button3); Button3BackgroundBrush.Color = Colors.Blue; }
从单个属性移除动画
禁止动画影响属性的另一种方法是使用正在进行动画处理的对象的 BeginAnimation(DependencyProperty, AnimationTimeline) 方法。 将正进行动画处理的属性指定为第一个参数,将 null 指定为第二个参数。
<Button Name="Button4" Content="Animate and Then Set Example 4"> <Button.Background> <SolidColorBrush x:Name="Button4BackgroundBrush" Color="Red" /> </Button.Background> <Button.Triggers> <EventTrigger RoutedEvent="Button.Click"> <BeginStoryboard> <Storyboard> <ColorAnimation Storyboard.TargetName="Button4BackgroundBrush" Storyboard.TargetProperty="Color" From="Red" To="Yellow" Duration="0:0:5" FillBehavior="HoldEnd" Completed="setButton4BackgroundBrushColor" /> </Storyboard> </BeginStoryboard> </EventTrigger> </Button.Triggers> </Button>
private void setButton4BackgroundBrushColor(object sender, EventArgs e) { // This appears to work: // the brush changes to blue. Button4BackgroundBrush.BeginAnimation(SolidColorBrush.ColorProperty, null); Button4BackgroundBrush.Color = Colors.Blue; }
此方法对于非演示图板动画也有效。
浙公网安备 33010602011771号