如果语句无限循环

时间:2014-02-20 03:35:38

标签: c# wpf animation if-statement

所以我正在创建的闹钟中使用了一个动画,我最终将其归结为能够重置自己。但是现在第一次激活它,然后如果我再次输入闹钟唤醒时间,闹钟将会熄灭2次,如果我第三次输入它只会发出同样的事情,此时警报会熄灭3次。 / p>

以下是代码:

    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();
        }
    }

所以在看到我的代码后,如果你能告诉我为什么会发生这种情况,请忽略编写代码的严重程度......(我正在做一个等于凌乱编码的测试阶段)。

2 个答案:

答案 0 :(得分:0)

您的问题很可能是您在此处不止一次订阅了各种活动:

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

..在这里:

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

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

幸运的是,修复很容易。您的事件实际上并不依赖于它周围的任何变量/代码。所以从您的计时器滴答中取出事件订阅,以便它们触发一次(也许在app启动时)它应该没问题。

*假设你的其余代码没有做类似的事情。

答案 1 :(得分:0)

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

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

制作了一个新的活动来收集所有警报唤醒信息并且它有效!