Compartilhar via


Como: Definir uma Propriedade Após Animá-la com um Storyboard

Em alguns casos, pode parecer que você não pode alterar o valor de uma propriedade depois que ela tenha sido animada.

Exemplo

No exemplo a seguir, um Storyboard serve para animar a cor de um SolidColorBrush. O storyboard é acionado quando o botão é clicado. O evento Completed é tratado para que o programa seja notificado quando o ColorAnimation concluir.

<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>

Após a conclusão da ColorAnimation, o programa tenta alterar a cor do pincel para azul.

private void setButton1BackgroundBrushColor(object sender, EventArgs e)
{

    // Does not appear to have any effect:
    // the brush remains yellow.
    Button1BackgroundBrush.Color = Colors.Blue;
}

O código anterior parece não fazer nada: o pincel permanece amarelo, que é o valor fornecido pelo ColorAnimation o pincel que animado. O valor da propriedade subjacente (o valor de base), na verdade, é alterado para azul. No entanto, o valor atual, ou eficaz, permanece amarelo porque a ColorAnimation ainda está substituindo o valor base. Se você deseja que o valor de base se torne o valor efetivo novamente, você deve fazer com que a animação pare de influenciar a propriedade. Existem três maneiras para fazer isso com animações de storyboard:

  • Defina a propriedade FillBehavior da animação para Stop

  • Remova o storyboard inteiro.

  • Remova a animação da propriedade individual.

Defina a propriedade FillBehavior da animação como Stop

Ao definir FillBehavior como Stop, você indica que a animação deve parar de afetar sua propriedade de destino após atingir o final do seu período ativo.

<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;
}

Remova o storyboard inteiro

Usando um disparador de RemoveStoryboard ou o método Storyboard.Remove, você indica que as animações do storyboard devem parar de afetar suas propriedades de destino. A diferença entre essa abordagem e a propriedade FillBehavior é que você pode remover o storyboard a qualquer momento, enquanto a propriedade FillBehavior somente tem efeito quando a animação atingir o final do seu período ativo.

<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;
}    

Remover uma animação de uma propriedade individual

Outra técnica para fazer com que uma animação pare de afetar uma propriedade é usar o método BeginAnimation(DependencyProperty, AnimationTimeline) do objeto sendo animado. Especifique a propriedade sendo animada como o primeiro parâmetro e null como o segundo.

<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;
}    

Essa técnica também funciona para animações que não sejam de storyboard.

Consulte também

Conceitos

Revisão de Animação

Visão geral de técnicas de animação de propriedades

Referência

FillBehavior

Storyboard.Remove

RemoveStoryboard