2014-02-20 239 views
0

所以我创建的闹钟在其中使用了一个动画,并且我终于明白了这一点,并重新设置了自己的能力。但现在第一次启动时,如果再次输入警报唤醒时间,则警报将熄灭2次,如果我第三次输入警报,它也会执行相同的操作,只是这次警报熄灭了3次。如果语句无限循环

下面是代码:

private void dispatcherTimer1_Tick(object sender, EventArgs e) 
    { 
     label1.Content = DateTime.Now.ToString("hh") + ":" + DateTime.Now.ToString("mm") + " " + DateTime.Now.ToString("t"+2); 
    } 

    //ALARM CLOCK 

    private void dispatcherTimer2_Tick(object sender, EventArgs e) 
    { 
     OpacityLower.Duration = new Duration(TimeSpan.FromSeconds(3)); 
     OpacityLower.AutoReverse = false; 
     OpacityLower.To = 0.0; 
     OpacityRaise.Duration = new Duration(TimeSpan.FromSeconds(3)); 
     OpacityRaise.AutoReverse = false; 
     OpacityRaise.To = 100.0; 

     //Alarm settings 

     if (label1.Content.Equals(label2.Content)) 
     { 
      //ANIMATION 
      OpacityLower.Completed += (s, d) => 
       { 
        //Actual Wake Up Call, of which i took out so nobody could get the code, also it not relevant to this, 

        TimeOfDayCB.Text = ""; 
        HourAlarmCB.Text = ""; 
        MinuteAlarmCB.Text = ""; 
        label2.Content = null; 
        dispatcherTimer2.Stop(); 
        label2.BeginAnimation(Label.OpacityProperty, OpacityRaise); 

        OpacityRaise.Completed += (z, c) => 
         { 
          TimeOfDayCB.Text = ""; 
          HourAlarmCB.Text = ""; 
          MinuteAlarmCB.Text = ""; 
          label2.Content = null; 
          dispatcherTimer2.Stop(); 
         }; 
       }; 
      label2.BeginAnimation(Label.OpacityProperty, OpacityLower); 
      dispatcherTimer2.Stop(); 
     } 
    } 

所以看到我的代码,如果你能告诉我,为什么发生这种情况,并请忽略代码是如何写的不好后......(我在做一个测试阶段这相当于凌乱的编码)。

回答

0

您的问题可能是您订阅的事件不止一次在这里更多:

//ANIMATION 
OpacityLower.Completed += (s, d) => 

..和这里:

OpacityRaise.Completed += (z, c) => 

每次计时器滴答..一个新的事件添加到队列中。这就是为什么他们被称为MulticastDelegate s ..他们可以有多个(和你使用+=追加的原因)。

幸运的是修复很简单。你的事件实际上并不依赖于它周围的任何变量/代码。因此,请将事件订阅从计时器滴答开始,以便它们只会触发一次(也许在应用程序启动时),并且应该很好*。

*假设您的其他代码不会执行类似的操作。

+0

雅是我认为问题会在哪里。所以要解决这个问题我该怎么做Opacity.Lowered.Completed + = ???或Opacity.Lowered.Completed;此外,Opacity.Raised事件也会执行相同的操作... –

+0

将所有这些事件从'dispatcherTimer2_Tick'方法移出并进入应用程序启动。 –

+0

不幸的是,并没有解决这个问题。它仍然发射两次,我认为他们自己的标签没有通过 –

0

所以在最后我用这个网站,帮助我完成代码:When an animation is completed

我刚换了事件的故事板与我现有的“OpacityRaised”活动!

做了一个新的事件,以容纳所有的闹钟唤醒信息,它的工作!