1

我通过情节提要在我的 WP7 应用程序中引入了一些动画。这一切都在第一次按预期工作 - 事件发生,我调用代码在后面的代码中做动画,我得到了我想要的行为。但是当我第二次触发时,就像涉及到的委托代码被调用了两次。然后我触发了相同的事件,委托代码被调用了 3 次。其累积。

调用的代码如下

 private void WeekForward()
    {


        FadeTitleOut.Begin();

        FadeTitleOut.Completed += delegate
        {

            StartingMonday = StartingMonday.AddDays(7);
            BuildPage();
            FadeTitleIn.Begin();
        }; 



    }

FadeTitleOut 和 FadeTitleIn 是我的故事板,动画效果很好。只是事件第一次发生 StartingMonday 时增加了 7 天。下次事件触发时,它会增加 14 天,依此类推。

我是否对我的委托代码做了一些非常愚蠢的事情?

可能应该补充一点,我在后面的代码中完成了大部分工作,包括动态地生成和删除控件,但是情节提要是在 XAML 中定义的,它们引用了在 XAML 中定义的控件(而不是在后面的代码)

故事板 XAML 是

 <phone:PhoneApplicationPage.Resources>
    <Storyboard x:Name="FadeTitleOut">
        <DoubleAnimation Storyboard.TargetName="LayoutRoot" Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:0.3" />
    </Storyboard>

    <Storyboard x:Name="FadeTitleIn">
        <DoubleAnimation Storyboard.TargetName="LayoutRoot" Storyboard.TargetProperty="Opacity" From="0.0" To="1.0" Duration="0:0:0.3" />
    </Storyboard>
</phone:PhoneApplicationPage.Resources>

有任何想法吗?

4

1 回答 1

0

看看你的代码,我的猜测是“WeekForward()”被调用的频率比你想要的要多,而且你每次调用它时都订阅 FadeTitleOut.Completed(因此你描述的行为)。解决此问题的一种方法是将此代码放在其他位置,以便它只订阅 Completed 事件一次。

此外,您应该在触发 Begin 方法之前写下您的事件,因为您有潜在的竞争条件。例如,

    FadeTitleOut.Completed += delegate
    {

        StartingMonday = StartingMonday.AddDays(7);
        BuildPage();
        FadeTitleIn.Begin();
    }; 

    FadeTitleOut.Begin();

将此代码放在将在 XAML 页面的生命周期内触发一次的地方,它应该没问题。希望有帮助。

于 2012-12-12T23:23:47.880 回答