既然动画类是由一组有用的属性组成,那么,我们就会很容易想到,可以在
XAML
中定义一个动画。
<DoubleAnimation From="20" To="60" Duration="0:0:5" AutoReverse="True" FillBehavior="Stop"/>
这就是一个
Double
类型的动画。
定义的动画放在哪里呢?一种选择是将它定义为资源,可以在后台代码中通过
Resources
或
FindResource()
得到,甚至可以在用之前再调整动画的属性,来得到不同的效果。动画放置在资源中,例如:
<Window.Resources>
<Storyboard x:Key="sb">
<DoubleAnimation From="20" To="60" Duration="0:0:5" AutoReverse="True" FillBehavior="Stop"/>
</Storyboard>
</Window.Resources>
另外一个放置动画的地方就是
Triggers
的
Action
中。在
EventTrigger
中包含
Storyboard
,是最典型的用法。例如:
<Button Content="xirihanlin">
<Button.Background>
<LinearGradientBrush>
<GradientStop Color="Orange" Offset="0"/>
<GradientStop Color="GreenYellow" Offset="0.5"/>
<GradientStop Color="Orange" Offset="1"/>
</LinearGradientBrush>
</Button.Background>
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Loaded">
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Background.GradientStops[1].Color"
From="GreenYellow" To="White" Duration="0:0:2"
AutoReverse="True" RepeatBehavior="Forever"/>
<DoubleAnimation Storyboard.TargetProperty="Background.GradientStops[1].Offset"
From="0" To="1" Duration="0:0:2"
AutoReverse="True" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
DoubleAnimation
和
ColorAnimation
被放置在
Storyboard
中,而
Storyboard
被包裹在一个
BeginStoryboard
的动作里。当
EventTrigger
中的定义的事件(
Button.Loaded
)被激活时,就会执行
BeginStoryboard
这个动作(即播放动画)。
到这里,我们需要注意几件事情:
1
)
Storyboard
可以作为一个容器,容纳一个或多个动画,因为它的
Content
属性是
Children
,是
Timeline
对象的集合(所有动画类的基类);
2
)在
XAML
中,除非
ColorAnimation
等动画放置在
Storyboard
中,否则它们不能被初始化;
3
)动画的播放需要指定两个重要的属性:
TargetName
和
TargetProperty
。
TargetProperty
在上面已经看到,
TargerName
被隐式指定,那就是
Trigger
的对象,在这里就是我们的
Button
;
4
)
Storyboard
继承自
Timeline
,也能指定
Duration
、
BeginTime
等属性,因此,
Storyboard
上的属性设定与单独在每个子动画上做的设定效果可能会不同;
5
)
BeginStoryboard
继承自
TriggerAction
,与它一起的还有其他好几个动作;
接下来重点看看
TargetName
和
TargetProperty
。
TargetProperty
:它的类型是
PropertyPath
,它支持复杂的设置(如一个带许多子属性的属性),如在上述代码中的“
Background.GradientStops[1].Color
”。
TargetProperty
的语法是模仿
C#
访问属性时的键入,但不需要类型转换。执行时,
Storyboard
会假设
Button
的
Backgound
被设置成
GradientStops
属性中的某个对象,甚至假设该属性至少有两项,并且第二项有一个类型为
Color
的
Color
属性。如果这些假设中的任意一个不符合要求,那么动画就会失败。
当然,上面的代码是正确的,所以动画就能正常播放,效果如下图所示:
很漂亮的说
~~~~
TargetName
:在默认情况下,
TargetName隐式指定为
触发器(
Trigger
)的对象;如果在
Style
中使用动画,
TargetName
隐式指定为
模板化的父对象。当然,你也可以设定为其他目标对象,但是,目标对象必须拥有
TargetProperty
所设定的属性。关于在
Style
中添加
EventTrigger
和
Storyboard
,有一个
Demo
,当鼠标在图片上时,图片放缩2倍,离开时,图片恢复到原来大小。执行的效果如下图所示:
代码见
Demo
。