Вы говорите, что ваше сердце не имеет установленного имени, но вы дважды ссылаетесь на него в раскадровке с ElementName=Heartbeat
? В любом случае проблема заключается в следующей строке:
<BeginStoryboard Name="HeartbeatStoryboard"/>
Это просто дает имя элементу временной шкалы BeginStoryboard
, я подозреваю, что вы на самом деле намеревались это:
<BeginStoryboard Storyboard="{StaticResource HeartbeatStoryboard2X}"/>
ОБНОВЛЕНИЕ: если присмотреться, на самом деле есть несколько проблем, хотя мне нужно было бы увидеть MCVE для их правильного решения. Прежде всего, вы уже запускаете раскадровку в стиле вашего элемента управления, поэтому вам не нужно устанавливать Storyboard.Target
. И даже если бы это было так, то и Storyboard должны быть установлены и на Storyboard.TargetProperty
, а не на анимации. Наконец, когда вы вызываете heartbeatStoryboard.Begin
и heartbeatStoryboard.Stop
, вам нужно передать элемент (т.е. this.Heartbeat
).
Таким образом, ваш XAML должен выглядеть примерно так:
<Storyboard x:Key="HeartbeatStoryboard2X"
RepeatBehavior="2x"
Completed="Storyboard_Completed"
Storyboard.TargetProperty="Opacity">
<DoubleAnimation From="0.05" To="0.8" Duration="0:0:0.500" />
<DoubleAnimation From="0.8" To="0.05" Duration="0:0:1.500">
<DoubleAnimation.EasingFunction>
<PowerEase EasingMode="EaseOut" Power="6" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
Ваш обработчик раскадровки не должен выглядеть так:
private void Storyboard_Completed(object sender, EventArgs e)
{
ClockGroup clockGroup = sender as ClockGroup;
Storyboard heartbeatStoryboard = clockGroup.Timeline as Storyboard;
if (viewModel.IsHeartBeating == true)
{
m_restartedAnimation = true;
heartbeatStoryboard.Begin(this.Heartbeat);
}
else
{
if (m_restartedAnimation == true)
{
heartbeatStoryboard.Stop(this.Heartbeat);
}
m_restartedAnimation = false;
}
}