Starting an Animation with Code
The EventTrigger approach is an easy way to kick off an animation. However, in the current build, not all Silverlight events can be used as event triggers. The Loaded event is supported, but mouse-related events like MouseEnter, MouseLeave, and MouseMove are not.
If you want to start an animation in response to these events, you need to interact with the storyboard programmatically. Fortunately, it's easy. The first step is to move your storyboard out of the Triggers collection and place it in another collection of the same element: the Resources collection.
All Silverlight elements provide a Resourcesproperty, which holds a collection where you can store miscellaneous objects. The primary purpose of the Resources collection is to allow you to define objects in XAML that aren't elements, and so can't be placed into the visual layout of your content region. For example, you might want to declare a Brush object as a resource so it can be used by more than one element. Resources can be retrieved in your code or used elsewhere in your markup. Here's an example that defines the rectangle-growing animation as a resource:
<Canvas x:Name="canvas" MouseLeftButtonDown="canvas_Click" ... > <Canvas.Resources> <Storyboard x:Name="growStoryboard"> <DoubleAnimation Storyboard.TargetName="rect" Storyboard.TargetProperty="Width" Storyboard.TargetName="canvas" From="160" To="300" Duration="0:0:5"></DoubleAnimation> </Storyboard> </Canvas.Triggers> Rectangle Name="rect" Height="40" Width="160" Fill="Blue" Canvas.Left="10" Canvas.Top="10"></Rectangle> Canvas>
Notice that it's now given a name, so you can manipulate it in your code. You'll also notice that you need to explicitly specify the Storyboard.TargetName property to connect it to the right element when you're using this approach.
Now you simply need to call the methods of the Storyboard object in an event handler in your Silverlight code-behind file. The methods you can use include Begin(), Stop(), Pause(), Resume, and Seek(), all of which are fairly self-explanatory.
private void canvas_Click(object o, EventArgs e) { growStoryboard.Begin(); }
Configuring Animation Properties
To get the most out of your animations, you need to look a little closer at the base Animation class, which defines the properties that are provided by all animation classes. Table 1 describes them all.
From | Sets the starting values for your animation. In many situations, you won't set From. In this case, Silverlight uses the current value of your element. For example, if you didn't set the initial width in the growing rectangle example, it would start at whatever it is currently. This is particularly useful if you're animating a value that might be changed by other code or other animations. In this situation, you want the animation to start from the current value, not jump abruptly to a preset From value. |
To | Sets the ending value for your animation. In some situations, you won't set From or To. In this case, the property returns to whatever initial value is set in =the XAML markup. For example, you could use this technique to shrink the rectangle in the previous example back to its original size when it's clicked. | By | Instead of using To, you can use By to create a cumulative animation. By sets a number that will be added to the initial value. For example, if you replace the To value in the rectangle growing example with a By value of 10, the rectangle will grow 10 pixels wider than its current width over the course of the animation. If you run this animation every time the rectangle is clicked, it will continue to grow, and grow. | Duration | The length of time the animation runs, from start to finish, as a Duration object. | AutoReverse | If true, the animation will play out in reverse once it's complete, reverting to the original value. This also doubles the time the animation takes. | RepeatBehavior | Allows you to repeat an animation a specific number of seconds. Or, you can use Forever to repeat the animation endlessly. | BeginTime | Sets a delay that will be added before the animation starts (as a TimeSpan). This delay is added to the total time, so a 5-second animation with a 5-second delay takes 10 seconds. BeginTime is useful when synchronizing different animations that start at the same time but should apply their effects in sequence. | SpeedRatio | Increases or decreases the speed of the animation. Ordinarily, SpeedRatio is 1. If you increase it, the animation completes more quickly (for example, a SpeedRatio of 5 completes five times faster). If you decrease it, the animation is slowed down (for example, a SpeedRatio of 0.5 takes twice as long). You can change the duration of your animation for an equivalent result. The SpeedRatio is not taken into account when applying the BeginTime delay. | FillBehavior | Determines what happens when the animation ends. Usually, it keeps the property fixed at the ending value (FillBehavior.HoldEnd), but you can also choose to return it to its original value (FillBehavior.Stop). |