WPF故事板对象参考

时间:2020-04-05 21:14:14

标签: c# wpf

我有一个用户控件,它是我需要跳动的心脏形状。这是我的代码:

<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

1 个答案:

答案 0 :(得分:1)

您说您的心脏没有设置名称,但是您在故事板上用ElementName=Heartbeat引用了它两次?无论如何,问题出在这一行:

<BeginStoryboard Name="HeartbeatStoryboard"/>

这只是给BeginStoryboard时间轴元素本身起了个名字,我怀疑您的实际意图是这样:

<BeginStoryboard Storyboard="{StaticResource HeartbeatStoryboard2X}"/>

更新:仔细看实际上存在一些问题,尽管我需要看到MCVE才能正确解决它们。首先,您已经以控件的样式触发了情节提要,因此无需设置Storyboard.Target。即使您是,也应该在情节提要(而不是动画)上同时设置Storyboard.TargetPropertyheartbeatStoryboard.Begin。最后,当您调用heartbeatStoryboard.Stopthis.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'>