我通过故事板向我的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>
有什么想法吗?
答案 0 :(得分:0)
仔细查看你的代码,我的猜测是“WeekForward()”被调用的次数比你想要的要多,而且你每次调用时都会订阅FadeTitleOut.Completed(因此你描述的行为) 。修复此问题的一种方法是将此代码放在其他地方,这样它只能订阅一次Completed事件。
此外,由于您有潜在的竞争条件,因此您应该在触发Begin方法之前写下您的事件。例如,
FadeTitleOut.Completed += delegate
{
StartingMonday = StartingMonday.AddDays(7);
BuildPage();
FadeTitleIn.Begin();
};
FadeTitleOut.Begin();
将此代码放在XAML页面生命周期中将被触发一次的位置,它应该没问题。希望有所帮助。