我正在编写一个具有多个状态的应用程序。按空格键交换状态,当前状态存储在枚举中。我通过 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; 为了防止在我按住空格键时事件在循环中触发,但它没有发生,所以我刚开始保持空格,但相位一直在循环,所以它不起作用。任何人都知道我做错了什么?请问怎么解决?