在某些情况下,在对属性进行动画处理后,看起来可能无法更改该属性的值。

对 SolidColorBrush 的颜色进行动画处理

在以下示例中, 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;
Private Sub setButton1BackgroundBrushColor(ByVal sender As Object, ByVal e As EventArgs)
    ' Does not appear to have any effect:
    ' the brush remains yellow.
    Button1BackgroundBrush.Color = Colors.Blue
End Sub

前面的代码似乎未执行任何操作:画笔保持为黄色,这是对画笔进行动画处理的 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;
    
    Private Sub setButton2BackgroundBrushColor(ByVal sender As Object, ByVal e As EventArgs)
        ' This appears to work:
        ' the brush changes to blue.
        Button2BackgroundBrush.Color = Colors.Blue
    End Sub
    

    删除整个情节提要

    通过使用 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;
    
    Private Sub setButton3BackgroundBrushColor(ByVal sender As Object, ByVal e As EventArgs)
         ' This appears to work:
        ' the brush changes to blue.
        MyStoryboard.Remove(Button3)
        Button3BackgroundBrush.Color = Colors.Blue
    End Sub
    

    从单个属性中删除动画

    另一种阻止动画影响属性的技术是使用正在进行动画处理的对象的 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;
    
    Private Sub setButton4BackgroundBrushColor(ByVal sender As Object, ByVal e As EventArgs)
         ' This appears to work:
        ' the brush changes to blue.
        Button4BackgroundBrush.BeginAnimation(SolidColorBrush.ColorProperty, Nothing)
        Button4BackgroundBrush.Color = Colors.Blue
    End Sub
    

    此技术也适用于非情节提要动画。

  • FillBehavior
  • Storyboard.Remove
  • RemoveStoryboard
  • 属性动画技术概述
  •