Как установить свойство после анимации с помощью сториборда
В некоторых случаях может показаться, что вы не можете изменить значение свойства после анимации.
Анимируйте цвет 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
- Обзор анимации
- Обзор методов анимации свойств
.NET Desktop feedback