How to: Animate a Rectangle Geometry by Using Key Frames

 

This example shows how to animate the Rect property of a RectangleGeometry by using key frames.

Example

The following example uses the RectAnimationUsingKeyFrames class to animate the Rect property of a RectangleGeometry. This animation uses three key frames in the following manner:

  1. During the first two seconds, uses an instance of the LinearRectKeyFrame class to animate a gradual change in the position, width, and height of a rectangle. Linear key frames like LinearRectKeyFrame create a smooth linear transition between values.

  2. During the end of the next half second, uses an instance of the DiscreteRectKeyFrame class to suddenly decrease the height of the rectangle. Discrete key frames like DiscreteRectKeyFrame create sudden changes between values, that is, the decrease in height occurs quickly and is not subtle.

  3. During the final two seconds, uses an instance of the SplineRectKeyFrame class to change the rectangle back to its original size and position. Spline key frames like SplineRectKeyFrame create a variable transition between values according to the values of the KeySpline property. In this example, the change begins slowly and speeds up exponentially toward the end of the time segment.


Imports System
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Shapes
Imports System.Windows.Media.Animation
Imports System.Windows.Media

Namespace Microsoft.Samples.KeyFrameExamples
	''' <summary>
	''' This example shows how to use the RectAnimationUsingKeyFrames class to
	''' animate the position and size of a rectangle.
	''' Key frame animations enable you to create complex animations 
	''' by specifying multiple destination values
	''' and controlling the animation's interpolation method.
	''' </summary>
	Public Class RectAnimationUsingKeyFramesExample
		Inherits Page
		Public Sub New()
			Title = "RectAnimationUsingKeyFrames Example"
			Background = Brushes.White
			Margin = New Thickness(20)

			' Create a NameScope for this page so that
			' Storyboards can be used.
			NameScope.SetNameScope(Me, New NameScope())

			Dim myStackPanel As New StackPanel()
			myStackPanel.Orientation = Orientation.Vertical
			myStackPanel.HorizontalAlignment = HorizontalAlignment.Center

			'Add the Path Element
			Dim myPath As New Path()
			myPath.Stroke = Brushes.Black
			myPath.Fill = Brushes.LemonChiffon
			myPath.StrokeThickness = 1

			' Create a RectangleGeometry to specify the Path data.
			Dim myRectangleGeometry As New RectangleGeometry()
			myRectangleGeometry.Rect = New Rect(0, 200, 100, 100)
			myPath.Data = myRectangleGeometry

			myStackPanel.Children.Add(myPath)

			' Assign the TranslateTransform a name so that
			' it can be targeted by a Storyboard.
			Me.RegisterName("AnimatedRectangleGeometry", myRectangleGeometry)

			' Create a RectAnimationUsingKeyFrames to
			' animate the RectangleGeometry.
			Dim rectAnimation As New RectAnimationUsingKeyFrames()
			rectAnimation.Duration = TimeSpan.FromSeconds(6)

			' Set the animation to repeat forever. 
			rectAnimation.RepeatBehavior = RepeatBehavior.Forever

			' Animate position, width, and height in first 2 seconds. LinearRectKeyFrame creates
			' a smooth, linear animation between values.
			rectAnimation.KeyFrames.Add(New LinearRectKeyFrame(New Rect(600,50,200,50), KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2)))) ' KeyTime -  Target value (KeyValue)

			' In the next half second, change height to 10. DiscreteRectKeyFrame creates a 
			' sudden "jump" between values.
			rectAnimation.KeyFrames.Add(New DiscreteRectKeyFrame(New Rect(600, 50, 200, 10), KeyTime.FromTimeSpan(TimeSpan.FromSeconds(2.5)))) ' KeyTime -  Target value (KeyValue)

			' In the final 2 seconds of the animation, go back to the starting position, width, and height.  
			' Spline key frames like SplineRectKeyFrame creates a variable transition between values depending 
			' on the KeySpline property. In this example, the animation starts off slow but toward the end of 
			' the time segment, it speeds up exponentially.
			rectAnimation.KeyFrames.Add(New SplineRectKeyFrame(New Rect(0, 200, 100, 100), KeyTime.FromTimeSpan(TimeSpan.FromSeconds(4.5)), New KeySpline(0.6, 0.0, 0.9, 0.0))) ' KeySpline -  KeyTime -  Target value (KeyValue)

			' Set the animation to target the Rect property
			' of the object named "AnimatedRectangleGeometry."
			Storyboard.SetTargetName(rectAnimation, "AnimatedRectangleGeometry")
			Storyboard.SetTargetProperty(rectAnimation, New PropertyPath(RectangleGeometry.RectProperty))

			' Create a storyboard to apply the animation.
			Dim rectStoryboard As New Storyboard()
			rectStoryboard.Children.Add(rectAnimation)

			' Start the storyboard after the rectangle loads.
			AddHandler myPath.Loaded, Sub(sender As Object, e As RoutedEventArgs) rectStoryboard.Begin(Me)

			Content = myStackPanel
		End Sub

	End Class
End Namespace
<Page  
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="ThicknessAnimationUsingKeyFrames Example">

  <StackPanel Orientation="Vertical" HorizontalAlignment="Center">

    <Path Stroke="Black" StrokeThickness="1" Fill="LemonChiffon">
      <Path.Data>
        <RectangleGeometry x:Name="myRectangleGeometry" Rect="0,200,100,100" />
      </Path.Data>
      <Path.Triggers>
        <EventTrigger RoutedEvent="Path.Loaded">
          <BeginStoryboard>
            <Storyboard>

              <!-- Animate the Rect property of the RectangleGeometry which causes the
              rectangle to animate its position as well as its width and height. -->
              <RectAnimationUsingKeyFrames
                Storyboard.TargetName="myRectangleGeometry"
                Storyboard.TargetProperty ="Rect"
                Duration="0:0:6" FillBehavior="HoldEnd" RepeatBehavior="Forever">

                <!-- Animate position, width, and height in first 2 seconds. LinearRectKeyFrame creates
                a smooth, linear animation between values. -->
                <LinearRectKeyFrame Value="600,50,200,50" KeyTime="0:0:2" />

                <!-- In the next half second, change height to 10. DiscreteRectKeyFrame creates a 
                sudden "jump" between values. -->
                <DiscreteRectKeyFrame Value="600,50,200,10" KeyTime="0:0:2.5" />

                <!-- In the final 2 seconds of the animation, go back to the starting position, width, and height.  
                Spline key frames like SplineRectKeyFrame creates a variable transition between values depending 
                on the KeySpline property. In this example, the animation starts off slow but toward the end of 
                the time segment, it speeds up exponentially.-->
                <SplineRectKeyFrame Value="0,200,100,100" KeyTime="0:0:4.5" KeySpline="0.6,0.0 0.9,0.00"  />
              </RectAnimationUsingKeyFrames>
            </Storyboard>
          </BeginStoryboard>
        </EventTrigger>
      </Path.Triggers>
    </Path>

  </StackPanel>
</Page>

For the complete sample, see KeyFrame Animation Sample.

Show: