共用方式為


HOW TO:控制主要畫面格動畫執行時間

本範例說明如何控制主要畫面格動畫內的主要動畫格執行時間。 如同其他動畫,主要畫面格動畫也有 Duration 屬性。 除了指定動畫的持續時間,您還需要指定這段時間的哪一段要分配給動畫的每一個主要畫面格。 若要分配時間,請指定動畫中每個主要畫面格的 KeyTime

每個主要畫面格的 KeyTime 會指定主要畫面格結束的時間 (它不會指定主要畫面格播放的時間長度)。 您可以將 KeyTime 指定為 TimeSpan 值、百分比,或是 UniformPaced 特殊值。

範例

下列範例會使用 DoubleAnimationUsingKeyFrames,讓矩形顯示成移至畫面另一邊的動畫。 主要畫面格的主要時間使用 TimeSpan 值設定。

'            
'               This Rectangle is animated with KeyTimes using TimeSpan Values. 
'               It moves horizontally to 100 in the first 3 seconds, 100 to 300 in 
'               the next second, and 300 to 500 in the last 6 seconds.
'            

            ' Create the a rectangle.
            Dim aRectangle As New Rectangle()
            aRectangle.Fill = Brushes.Blue
            aRectangle.Stroke = Brushes.Black
            aRectangle.StrokeThickness = 5
            aRectangle.Width = 50
            aRectangle.Height = 50

            ' Create a transform to move the rectangle
            ' across the screen.
            Dim translateTransform1 As New TranslateTransform()
            aRectangle.RenderTransform = translateTransform1

            ' Create a DoubleAnimationUsingKeyFrames
            ' to animate the transform.
            Dim transformAnimation As New DoubleAnimationUsingKeyFrames()
            transformAnimation.Duration = TimeSpan.FromSeconds(10)

            ' Animate to 100 at 3 seconds.
            transformAnimation.KeyFrames.Add(New LinearDoubleKeyFrame(100, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(3))))

            ' Animate to 300 at 4 seconds.
            transformAnimation.KeyFrames.Add(New LinearDoubleKeyFrame(300, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(4))))

            ' Animate to 500 at 10 seconds.
            transformAnimation.KeyFrames.Add(New LinearDoubleKeyFrame(500, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(10))))

            ' Start the animation when the rectangle is loaded.
            AddHandler aRectangle.Loaded, Sub(sender As Object, e As RoutedEventArgs) translateTransform1.BeginAnimation(TranslateTransform.XProperty, transformAnimation)

            /*
               This Rectangle is animated with KeyTimes using TimeSpan Values. 
               It moves horizontally to 100 in the first 3 seconds, 100 to 300 in 
               the next second, and 300 to 500 in the last 6 seconds.
            */

            // Create the a rectangle.
            Rectangle aRectangle = new Rectangle();
            aRectangle.Fill = Brushes.Blue;
            aRectangle.Stroke = Brushes.Black;
            aRectangle.StrokeThickness = 5;
            aRectangle.Width = 50;
            aRectangle.Height = 50;

            // Create a transform to move the rectangle
            // across the screen.
            TranslateTransform translateTransform1 = 
                new TranslateTransform();
            aRectangle.RenderTransform = translateTransform1;

            // Create a DoubleAnimationUsingKeyFrames
            // to animate the transform.
            DoubleAnimationUsingKeyFrames transformAnimation = 
                new DoubleAnimationUsingKeyFrames();
            transformAnimation.Duration = TimeSpan.FromSeconds(10);

            // Animate to 100 at 3 seconds.
            transformAnimation.KeyFrames.Add(
                new LinearDoubleKeyFrame(100, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(3))));

            // Animate to 300 at 4 seconds.
            transformAnimation.KeyFrames.Add(
                new LinearDoubleKeyFrame(300, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(4))));

            // Animate to 500 at 10 seconds.
            transformAnimation.KeyFrames.Add(
                new LinearDoubleKeyFrame(500, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(10))));

            // Start the animation when the rectangle is loaded.
            aRectangle.Loaded += delegate(object sender, RoutedEventArgs e)
            {
                translateTransform1.BeginAnimation(TranslateTransform.XProperty, transformAnimation);
            };

<!-- This Rectangle is animated with KeyTimes using TimeSpan Values. 
     It moves horizontally to 100 in the first 3 seconds, 100 to 300 in 
     the next second, and 300 to 500 in the last 6 seconds. -->
<Rectangle Fill="Blue" Stroke="Black" StrokeThickness="5"
  Width="50" Height="50">
  <Rectangle.RenderTransform>
    <TranslateTransform x:Name="TranslateTransform1" />
  </Rectangle.RenderTransform>
  <Rectangle.Triggers>
    <EventTrigger RoutedEvent="Rectangle.Loaded">
      <BeginStoryboard>
        <Storyboard>
          <DoubleAnimationUsingKeyFrames 
            Storyboard.TargetName="TranslateTransform1" 
            Storyboard.TargetProperty="X"
            Duration="0:0:10">

            <!-- These KeyTime properties are specified as TimeSpan values 
                 which are in the form of "hours:minutes:seconds". -->
            <LinearDoubleKeyFrame Value="100" KeyTime="0:0:3" />
            <LinearDoubleKeyFrame Value="300" KeyTime="0:0:4" />
            <LinearDoubleKeyFrame Value="500" KeyTime="0:0:10" />
          </DoubleAnimationUsingKeyFrames>
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Rectangle.Triggers>
</Rectangle>

下圖顯示每個主要畫面格的值到達的時機。

在 3、4 和 10 秒時到達各個主要畫面格

下面的範例顯示完全相同的動畫,差別在於主要畫面格的主要時間是使用百分比值設定。

'            
'              This rectangle moves horizontally to 100 in the first 3 seconds, 
'              100 to 300 in  the next second, and 300 to 500 in the last 6 seconds.
'            

            ' Create the a rectangle.
            Dim aRectangle As New Rectangle()
            aRectangle.Fill = Brushes.Purple
            aRectangle.Stroke = Brushes.Black
            aRectangle.StrokeThickness = 5
            aRectangle.Width = 50
            aRectangle.Height = 50

            ' Create a transform to move the rectangle
            ' across the screen.
            Dim translateTransform2 As New TranslateTransform()
            aRectangle.RenderTransform = translateTransform2

            ' Create a DoubleAnimationUsingKeyFrames
            ' to animate the transform.
            Dim transformAnimation As New DoubleAnimationUsingKeyFrames()
            transformAnimation.Duration = TimeSpan.FromSeconds(10)

            ' Animate to 100 at 30% of the animation's duration.
            transformAnimation.KeyFrames.Add(New LinearDoubleKeyFrame(100, KeyTime.FromPercent(0.3)))

            ' Animate to 300 at 40% of the animation's duration.
            transformAnimation.KeyFrames.Add(New LinearDoubleKeyFrame(300, KeyTime.FromPercent(0.4)))

            ' Animate to 500 at 100% of the animation's duration.
            transformAnimation.KeyFrames.Add(New LinearDoubleKeyFrame(500, KeyTime.FromPercent(1.0)))

            ' Start the animation when the rectangle is loaded.
            AddHandler aRectangle.Loaded, Sub(sender As Object, e As RoutedEventArgs) translateTransform2.BeginAnimation(TranslateTransform.XProperty, transformAnimation)
/*
  This rectangle moves horizontally to 100 in the first 3 seconds, 
  100 to 300 in  the next second, and 300 to 500 in the last 6 seconds.
*/

// Create the a rectangle.
Rectangle aRectangle = new Rectangle();
aRectangle.Fill = Brushes.Purple;
aRectangle.Stroke = Brushes.Black;
aRectangle.StrokeThickness = 5;
aRectangle.Width = 50;
aRectangle.Height = 50;

// Create a transform to move the rectangle
// across the screen.
TranslateTransform translateTransform2 =
    new TranslateTransform();
aRectangle.RenderTransform = translateTransform2;

// Create a DoubleAnimationUsingKeyFrames
// to animate the transform.
DoubleAnimationUsingKeyFrames transformAnimation =
    new DoubleAnimationUsingKeyFrames();
transformAnimation.Duration = TimeSpan.FromSeconds(10);

// Animate to 100 at 30% of the animation's duration.
transformAnimation.KeyFrames.Add(
    new LinearDoubleKeyFrame(100, KeyTime.FromPercent(0.3)));

// Animate to 300 at 40% of the animation's duration.
transformAnimation.KeyFrames.Add(
    new LinearDoubleKeyFrame(300, KeyTime.FromPercent(0.4)));

// Animate to 500 at 100% of the animation's duration.
transformAnimation.KeyFrames.Add(
    new LinearDoubleKeyFrame(500, KeyTime.FromPercent(1.0)));

// Start the animation when the rectangle is loaded.
aRectangle.Loaded += delegate(object sender, RoutedEventArgs e)
{
    translateTransform2.BeginAnimation(TranslateTransform.XProperty, transformAnimation);
};
<!-- This rectangle moves horizontally to 100 in the first 3 seconds, 
     100 to 300 in  the next second, and 300 to 500 in the last 6 seconds.-->
<Rectangle Fill="Purple" Stroke="Black" StrokeThickness="5"
  Width="50" Height="50">
  <Rectangle.RenderTransform>
    <TranslateTransform x:Name="TranslateTransform2" />
  </Rectangle.RenderTransform>
  <Rectangle.Triggers>
    <EventTrigger RoutedEvent="Rectangle.Loaded">
      <BeginStoryboard>
        <Storyboard>
          <DoubleAnimationUsingKeyFrames 
            Storyboard.TargetName="TranslateTransform2" 
            Storyboard.TargetProperty="X"
            Duration="0:0:10">

            <!-- KeyTime properties are expressed as Percentages. -->
            <LinearDoubleKeyFrame Value="100" KeyTime="30%" />
            <LinearDoubleKeyFrame Value="300" KeyTime="40%" />
            <LinearDoubleKeyFrame Value="500" KeyTime="100%" />
          </DoubleAnimationUsingKeyFrames>
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Rectangle.Triggers>
</Rectangle>

下圖顯示每個主要畫面格的值到達的時機。

在 3、4 和 10 秒時到達各個主要畫面格

下面的範例使用 Uniform 主要時間值。

'            
'               This rectangle is animated with KeyTimes using Uniform values. 
'               Goes to 100 in the first 3.3 seconds, 100 to
'               300 in the next 3.3 seconds, 300 to 500 in the last 3.3 seconds.
'            

            ' Create the a rectangle.
            Dim aRectangle As New Rectangle()
            aRectangle.Fill = Brushes.Red
            aRectangle.Stroke = Brushes.Black
            aRectangle.StrokeThickness = 5
            aRectangle.Width = 50
            aRectangle.Height = 50

            ' Create a transform to move the rectangle
            ' across the screen.
            Dim translateTransform3 As New TranslateTransform()
            aRectangle.RenderTransform = translateTransform3

            ' Create a DoubleAnimationUsingKeyFrames
            ' to animate the transform.
            Dim transformAnimation As New DoubleAnimationUsingKeyFrames()
            transformAnimation.Duration = TimeSpan.FromSeconds(10)

'            
'               KeyTime properties are expressed with values of Uniform. When a key time is set to
'               "Uniform" the total allotted time of the animation is divided evenly between key frames.  
'               In this example, the total duration of the animation is ten seconds and there are four 
'               key frames each of which are set to "Uniform", therefore, the duration of each key frame 
'               is 3.3 seconds (10/3).
'             

            ' Animate to 100.
            transformAnimation.KeyFrames.Add(New LinearDoubleKeyFrame(100, KeyTime.Uniform))

            ' Animate to 300.
            transformAnimation.KeyFrames.Add(New LinearDoubleKeyFrame(300, KeyTime.Uniform))

            ' Animate to 500.
            transformAnimation.KeyFrames.Add(New LinearDoubleKeyFrame(500, KeyTime.Uniform))

            ' Start the animation when the rectangle is loaded.
            AddHandler aRectangle.Loaded, Sub(sender As Object, e As RoutedEventArgs) translateTransform3.BeginAnimation(TranslateTransform.XProperty, transformAnimation)

            /*
               This rectangle is animated with KeyTimes using Uniform values. 
               Goes to 100 in the first 3.3 seconds, 100 to
               300 in the next 3.3 seconds, 300 to 500 in the last 3.3 seconds.
            */

            // Create the a rectangle.
            Rectangle aRectangle = new Rectangle();
            aRectangle.Fill = Brushes.Red;
            aRectangle.Stroke = Brushes.Black;
            aRectangle.StrokeThickness = 5;
            aRectangle.Width = 50;
            aRectangle.Height = 50;

            // Create a transform to move the rectangle
            // across the screen.
            TranslateTransform translateTransform3 =
                new TranslateTransform();
            aRectangle.RenderTransform = translateTransform3;

            // Create a DoubleAnimationUsingKeyFrames
            // to animate the transform.
            DoubleAnimationUsingKeyFrames transformAnimation =
                new DoubleAnimationUsingKeyFrames();
            transformAnimation.Duration = TimeSpan.FromSeconds(10);

            /*
               KeyTime properties are expressed with values of Uniform. When a key time is set to
               "Uniform" the total allotted time of the animation is divided evenly between key frames.  
               In this example, the total duration of the animation is ten seconds and there are four 
               key frames each of which are set to "Uniform", therefore, the duration of each key frame 
               is 3.3 seconds (10/3).
             */

            // Animate to 100.
            transformAnimation.KeyFrames.Add(
                new LinearDoubleKeyFrame(100, KeyTime.Uniform));

            // Animate to 300.
            transformAnimation.KeyFrames.Add(
                new LinearDoubleKeyFrame(300, KeyTime.Uniform));

            // Animate to 500.
            transformAnimation.KeyFrames.Add(
                new LinearDoubleKeyFrame(500, KeyTime.Uniform));

            // Start the animation when the rectangle is loaded.
            aRectangle.Loaded += delegate(object sender, RoutedEventArgs e)
            {
                translateTransform3.BeginAnimation(TranslateTransform.XProperty, transformAnimation);
            };

<!-- This rectangle is animated with KeyTimes using Uniform values. 
     Goes to 100 in the first 3.3 seconds, 100 to
     300 in the next 3.3 seconds, 300 to 500 in the last 3.3 seconds. -->
<Rectangle Fill="Red" Stroke="Black" StrokeThickness="5"
  Width="50" Height="50">
  <Rectangle.RenderTransform>
    <TranslateTransform x:Name="TranslateTransform3" />
  </Rectangle.RenderTransform>
  <Rectangle.Triggers>
    <EventTrigger RoutedEvent="Rectangle.Loaded">
      <BeginStoryboard>
        <Storyboard>
          <DoubleAnimationUsingKeyFrames 
            Storyboard.TargetName="TranslateTransform3" 
            Storyboard.TargetProperty="X"
            Duration="0:0:10">

            <!--   KeyTime properties are expressed with values of Uniform. When a key time is set to
                   "Uniform" the total allotted time of the animation is divided evenly between key frames.  
                   In this example, the total duration of the animation is ten seconds and there are four 
                   key frames each of which are set to "Uniform", therefore, the duration of each key frame 
                   is 3.3 seconds (10/3). -->
            <LinearDoubleKeyFrame Value="100" KeyTime="Uniform" />
            <LinearDoubleKeyFrame Value="300" KeyTime="Uniform" />
            <LinearDoubleKeyFrame Value="500" KeyTime="Uniform" />
          </DoubleAnimationUsingKeyFrames>
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Rectangle.Triggers>
</Rectangle>

下圖顯示每個主要畫面格的值到達的時機。

在 3.3、6.6 和 9.9 秒時到達各個主要畫面格

最後一個範例使用 Paced 主要時間值。

'            
'               This rectangle is animated with KeyTimes using Paced Values. 
'               The rectangle moves between key frames at uniform rate except for first key frame
'               because using a Paced value on the first KeyFrame in a collection of frames gives a time of zero.
'            

            ' Create the a rectangle.
            Dim aRectangle As New Rectangle()
            aRectangle.Fill = Brushes.Orange
            aRectangle.Stroke = Brushes.Black
            aRectangle.StrokeThickness = 5
            aRectangle.Width = 50
            aRectangle.Height = 50

            ' Create a transform to move the rectangle
            ' across the screen.
            Dim translateTransform4 As New TranslateTransform()
            aRectangle.RenderTransform = translateTransform4

            ' Create a DoubleAnimationUsingKeyFrames
            ' to animate the transform.
            Dim transformAnimation As New DoubleAnimationUsingKeyFrames()
            transformAnimation.Duration = TimeSpan.FromSeconds(10)

'            
'               Use Paced values when a constant rate is desired. 
'               The time allocated to a key frame with a KeyTime of "Paced" is
'               determined by the time allocated to the other key frames of the animation. This time is 
'               calculated to attempt to give a "paced" or "constant velocity" for the animation.
'             

            ' Animate to 100.
            transformAnimation.KeyFrames.Add(New LinearDoubleKeyFrame(100, KeyTime.Paced))

            ' Animate to 300.
            transformAnimation.KeyFrames.Add(New LinearDoubleKeyFrame(300, KeyTime.Paced))

            ' Animate to 500.
            transformAnimation.KeyFrames.Add(New LinearDoubleKeyFrame(500, KeyTime.Paced))

            ' Start the animation when the rectangle is loaded.
            AddHandler aRectangle.Loaded, Sub(sender As Object, e As RoutedEventArgs) translateTransform4.BeginAnimation(TranslateTransform.XProperty, transformAnimation)

            /*
               This rectangle is animated with KeyTimes using Paced Values. 
               The rectangle moves between key frames at uniform rate except for first key frame
               because using a Paced value on the first KeyFrame in a collection of frames gives a time of zero.
            */

            // Create the a rectangle.
            Rectangle aRectangle = new Rectangle();
            aRectangle.Fill = Brushes.Orange;
            aRectangle.Stroke = Brushes.Black;
            aRectangle.StrokeThickness = 5;
            aRectangle.Width = 50;
            aRectangle.Height = 50;

            // Create a transform to move the rectangle
            // across the screen.
            TranslateTransform translateTransform4 =
                new TranslateTransform();
            aRectangle.RenderTransform = translateTransform4;

            // Create a DoubleAnimationUsingKeyFrames
            // to animate the transform.
            DoubleAnimationUsingKeyFrames transformAnimation =
                new DoubleAnimationUsingKeyFrames();
            transformAnimation.Duration = TimeSpan.FromSeconds(10);

            /*
               Use Paced values when a constant rate is desired. 
               The time allocated to a key frame with a KeyTime of "Paced" is
               determined by the time allocated to the other key frames of the animation. This time is 
               calculated to attempt to give a "paced" or "constant velocity" for the animation.
             */

            // Animate to 100.
            transformAnimation.KeyFrames.Add(
                new LinearDoubleKeyFrame(100, KeyTime.Paced));

            // Animate to 300.
            transformAnimation.KeyFrames.Add(
                new LinearDoubleKeyFrame(300, KeyTime.Paced));

            // Animate to 500.
            transformAnimation.KeyFrames.Add(
                new LinearDoubleKeyFrame(500, KeyTime.Paced));

            // Start the animation when the rectangle is loaded.
            aRectangle.Loaded += delegate(object sender, RoutedEventArgs e)
            {
                translateTransform4.BeginAnimation(TranslateTransform.XProperty, transformAnimation);
            };

<!-- This rectangle is animated with KeyTimes using Paced Values. 
     The rectangle moves between key frames at uniform rate except for first key frame
     because using a Paced value on the first KeyFrame in a collection of frames gives a time of zero. -->
<Rectangle Fill="Orange" Stroke="Black" StrokeThickness="5"
  Width="50" Height="50">
  <Rectangle.RenderTransform>
    <TranslateTransform x:Name="TranslateTransform4" />
  </Rectangle.RenderTransform>
  <Rectangle.Triggers>
    <EventTrigger RoutedEvent="Rectangle.Loaded">
      <BeginStoryboard>
        <Storyboard>
          <DoubleAnimationUsingKeyFrames 
            Storyboard.TargetName="TranslateTransform4" 
            Storyboard.TargetProperty="X"
            Duration="0:0:10">

            <!-- Use Paced values when a constant rate is desired. 
                 The time allocated to a key frame with a KeyTime of "Paced" is
                 determined by the time allocated to the other key frames of the animation. This time is 
                 calculated to attempt to give a "paced" or "constant velocity" for the animation. -->
            <LinearDoubleKeyFrame Value="100" KeyTime="Paced" />
            <LinearDoubleKeyFrame Value="300" KeyTime="Paced" />
            <LinearDoubleKeyFrame Value="500" KeyTime="Paced" />
          </DoubleAnimationUsingKeyFrames>
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Rectangle.Triggers>
</Rectangle>

下圖顯示每個主要畫面格的值到達的時機。

在 0、5 和 10 秒時到達各個主要畫面格

為了容易說明,此範例的程式碼版本使用本機動畫而非腳本,這是因為只將單一動畫套用到單一屬性,不過這些範例也可以修改成使用腳本。 如需說明如何在程式碼中宣告腳本的範例,請參閱 HOW TO:使用腳本建立屬性的動畫

如需完整範例,請參閱 KeyFrame 動畫範例 (英文)。 如需主要畫面格動畫的詳細資訊,請參閱主要畫面格動畫概觀

請參閱

概念

主要畫面格動畫概觀

動畫概觀

其他資源

動畫和計時 HOW TO 主題