Я определил раскадровку в источнике XAML UserControl
. Он играет, когда эта функция вызывается:Последующие звонки в раскадровку. Вставить (это, правда) замять анимацию
/// <summary>
/// Plays highlight animation.
/// </summary>
public void Highlight()
{
Storyboard highlighter = FindResource("Highlight") as Storyboard;
highlighter.Begin(this, true);
}
Это хорошо работает до тех пор, как анимация уже не играет, когда эта функция вызывается. Когда я вызываю функцию до того, как раскадровка закончит игру, анимация застрянет бесконечно. Почему это происходит? Вот источник анимации:
<Storyboard x:Key="Highlight" AutoReverse="True">
<ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0:0:0.15" Value="LightGray">
<EasingColorKeyFrame.EasingFunction>
<ElasticEase EasingMode="EaseIn" Oscillations="1"/>
</EasingColorKeyFrame.EasingFunction>
</EasingColorKeyFrame>
</ColorAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="LayoutRoot">
<EasingDoubleKeyFrame KeyTime="0:0:0.15" Value="0.6">
<EasingDoubleKeyFrame.EasingFunction>
<ElasticEase EasingMode="EaseIn" Oscillations="1"/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="LayoutRoot">
<EasingDoubleKeyFrame KeyTime="0:0:0.15" Value="0.6">
<EasingDoubleKeyFrame.EasingFunction>
<ElasticEase EasingMode="EaseIn" Oscillations="1"/>
</EasingDoubleKeyFrame.EasingFunction>
</EasingDoubleKeyFrame>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
Как я могу убедиться, что анимация не джем, когда раскадровка получает новый Begin
вызов, прежде чем он заканчивает играть? Я в порядке с перезагрузкой анимации при каждом вызове функции или без запуска новой анимации, пока она все еще играет. По какой-то причине, это дает исключение не может выполнить действие, поскольку указанная Раскадровка не была применена к этому объекту для интерактивного управления:
Storyboard highlighter = FindResource("Highlight") as Storyboard;
if (highlighter.GetCurrentState(this) == ClockState.Stopped)
highlighter.Begin(this, true);
Update: Я попробовал этот XAML на основе решения, основанное на Ответ XAMIMAX, но когда я использую это, анимация не воспроизводится вообще.
<UserControl.Triggers>
<EventTrigger RoutedEvent="local:StatusIcon.HighlightRequested">
<EventTrigger.EnterActions>
<BeginStoryboard x:Name="bidHighlight" Storyboard="{StaticResource Highlight}" />
</EventTrigger.EnterActions>
<EventTrigger.ExitActions>
<StopStoryboard BeginStoryboardName="bidHighlight" />
</EventTrigger.ExitActions>
</EventTrigger>
</UserControl.Triggers>
Вы пробовали это? [MSDN] (http://msdn.microsoft.com/en-us/library/cc663151 (v = vs.110) .aspx) – XAMlMAX
Увы, у меня такое же исключение, когда я тестировал * highlighter.GetCurrentProgress (это) == null *. – Pieter
Как вы относитесь к использованию триггеров в вашем «xaml», а не в подсветке кода? – XAMlMAX