我有一个用户控件,它是我需要跳动的心脏形状。这是我的代码:
<userControls:Heart x:Name="Heartbeat" Width="25" Height="25">
<userControls:Heart.Resources>
<Storyboard x:Key="HeartbeatStoryboard2X"
RepeatBehavior="2x"
Completed="Storyboard_Completed">
<DoubleAnimation Storyboard.TargetProperty="Opacity"
Storyboard.Target="{Binding ElementName=Heartbeat}"
From="0.05" To="0.8" Duration="0:0:0.500">
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetProperty="Opacity"
Storyboard.Target="{Binding ElementName=Heartbeat}"
From="0.8" To="0.05" Duration="0:0:1.500">
<DoubleAnimation.EasingFunction>
<PowerEase EasingMode="EaseOut" Power="6" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
</userControls:Heart.Resources>
<userControls:Heart.Style>
<Style TargetType="userControls:Heart">
<Style.Triggers>
<DataTrigger Binding="{Binding IsHeartBeating}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard Name="HeartbeatStoryboard"/>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</userControls:Heart.Style>
后面代码中的代码是:
public bool IsHeartBeating { get; set; }
private bool m_restartedAnimation = false;
private void Storyboard_Completed(object sender, EventArgs e)
{
ClockGroup clockGroup = sender as ClockGroup;
Storyboard heartbeatStoryboard = clockGroup.Timeline as Storyboard;
if (IsHeartBeating == true)
{
m_restartedAnimation = true;
heartbeatStoryboard.Begin();
}
else
{
if (m_restartedAnimation == true)
{
heartbeatStoryboard.Stop();
}
m_restartedAnimation = false;
}
}
我不断收到两个错误:
MC3093无法在元素“ BeginStoryboard”上设置“名称”属性值“ HeartbeatStoryboard”。 “ BeginStoryboard”在元素“ Heart”的范围内,该元素在注册时已经注册了名称 在另一个范围内定义。
和
XDG0062必须先有一个Storyboard对象引用,然后才能执行此触发操作。
我的心没有设定名称。
有任何想法吗?
TIA
答案 0 :(得分:1)
您说您的心脏没有设置名称,但是您在故事板上用ElementName=Heartbeat
引用了它两次?无论如何,问题出在这一行:
<BeginStoryboard Name="HeartbeatStoryboard"/>
这只是给BeginStoryboard
时间轴元素本身起了个名字,我怀疑您的实际意图是这样:
<BeginStoryboard Storyboard="{StaticResource HeartbeatStoryboard2X}"/>
更新:仔细看实际上存在一些问题,尽管我需要看到MCVE才能正确解决它们。首先,您已经以控件的样式触发了情节提要,因此无需设置Storyboard.Target
。即使您是,也应该在情节提要(而不是动画)上同时设置Storyboard.TargetProperty
和heartbeatStoryboard.Begin
。最后,当您调用heartbeatStoryboard.Stop
和this.Heartbeat
时,您需要传递元素(即<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>
)。
因此您的XAML需要看起来像这样:
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;
}
}
您的情节提要处理程序需要如下所示:
['NIO']
<class 'str'>