Show / Hide Table of Contents

Практическое руководство. Определение свойства после его анимации с помощью раскадровки

В некоторых случаях может оказаться, что не удается изменить значение свойства после его анимации.

Пример

В следующем примере 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;
}

Приведенный выше код не выполняет никаких действий: кисть остается желтой, что является значением, предоставляемые ColorAnimation , анимировать кисть. Значение базового свойства (базовое значение) фактически изменяется на синий. Тем не менее эффективно, или текущий, значение остается желтый поскольку ColorAnimation по-прежнему переопределяет базовое значение. Если требуется базовое значение снова становятся действительное значение, необходимо остановить влияние свойства анимации. Существует три способа это сделать с помощью анимации раскадровки:

  • Анимации FillBehavior свойства Stop

  • Удаление всей раскадровки.

  • Удалите анимацию из отдельного свойства.

Значение Stop анимации FillBehavior-свойство

Установив 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;
}

Удаление раскадровки

С помощью 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;
}

Удалить анимацию из отдельного свойства

Другим способом остановки влияния свойство анимации является использование 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;
}

Этот способ также подходит для анимаций без раскадровки.

См. также

  • FillBehavior
  • Storyboard.Remove
  • RemoveStoryboard
  • Общие сведения об эффектах анимации
  • Общие сведения о методах анимации свойств
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX