WP7 - 使用故事板时代表的问题

时间:2012-12-12 20:48:55

标签: windows-phone-7 delegates storyboard

我通过故事板向我的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>

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

仔细查看你的代码,我的猜测是“WeekForward()”被调用的次数比你想要的要多,而且你每次调用时都会订阅FadeTitleOut.Completed(因此你描述的行为) 。修复此问题的一种方法是将此代码放在其他地方,这样它只能订阅一次Completed事件。

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

    FadeTitleOut.Completed += delegate
    {

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

    FadeTitleOut.Begin();

将此代码放在XAML页面生命周期中将被触发一次的位置,它应该没问题。希望有所帮助。