0

我正在编写一个具有多个状态的应用程序。按空格键交换状态,当前状态存储在枚举中。我通过 KeyUp 和 KeyDown 事件处理交换。

我想实现:当我按下(并按住)空格键时,我只想切换到下一个阶段,并等到空格键被释放。当它被释放时,窗口会做一些事情(使用 StopWatch 和 DispatcherTimer 计算时间),并且在我再次按下空格后停止,这也会切换到下一个状态,依此类推。

该窗口包含当前阶段 (Phase) 的属性以及 KeyUp 和 KeyDown 事件的事件方法(称为 KeyRelease() 和 KeyPress()):

    private enum EPhase { Initiation, Countdown, MeasureTime, End }

    public event PropertyChangedEventHandler PropertyChanged;
    private void UpdateProperty(string name) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 

    private Phase _phase;
    private Phase { get { return _phase; } set { _phase = value; }

    private void KeyPress(object sender, KeyEventArgs e)
    {
        switch (Phase)
        {
            case EPhase.Initiation:
                {
                    if (e.Key == Key.Space)
                    {
                        Phase = EPhase.CountDown;
                        timer.SetCountdown(30);
                    }
                    break;
                }
            case EPhase.CountDown:
                {
                    if (e.Key == Key.Space)
                    {
                        Phase = EPhase.MeasureTime;
                        timer.StopTime();
                        timer.ResetTime();
                    }
                    break;
                }
            case EPhase.MeasureTime:
                {
                    Phase = EPhase.End;
                    timer.StopTime();
                }
            case EPhase.End: break;
        }
        e.Handled = true;
    }

    private void KeyRelease(object sender, KeyEventArgs e)
    {
        switch (Phase)
        {
            case EPhase.Initiation: break;
            case EPhase.Countdown:
                {
                    if (e.Key == Key.Space) timer.Countdown();
                    break;
                }
            case EPhase.MeasureTime:
                {
                    if (e.Key == Key.Space) timer.StartMeasure();
                    break;
                }
            case EPhase.End:
                {
                    if (e.Key == Key.Space) Phase = EPhase.Initiation;
                    break;
                }
        }
        e.Handled = true;
    }

其中 Timer 是我的 Timer 类的一个实例,它是我自己的用于处理测量和倒计时的类。此类的属性绑定到表单的文本块。

这就是问题所在 - 我正在尝试使用 e.Handled = true; 为了防止在我按住空格键时事件在循环中触发,但它没有发生,所以我刚开始保持空格,但相位一直在循环,所以它不起作用。任何人都知道我做错了什么?请问怎么解决?

4

0 回答 0