private void updateDisplay(Object displayBlock)
{
TimeSpan ts = timeWatch.Elapsed;
if (stopRing == true)
{
stopRing = true;
Thread.Sleep(1000);
stopRing = false;
}
if (ts.Minutes == 0 && ts.Seconds == 10 && ts.Milliseconds <= 100 && stopRing == false)
{
stopRing = true;
btnSound_Click_1(null, null);
}
TextBlock db = (TextBlock)displayBlock;
db.Dispatcher.BeginInvoke(delegate() { db.Text = String.Format("{0:00}:{1:00}", ts.Minutes, ts.Seconds); });
}
编辑: if(stopRing == true) 的原因是因为将来,我想在下面的函数中添加更多条件,以便它在一段时间后再次响铃,例如:
if (ts.Minutes == 0 && ts.Seconds == 10 && ts.Milliseconds <= 100 && stopRing == false || ts.Minutes == 0 && ts.Seconds == 20 && ts.Milliseconds <= 100 && stopRing == false)
但为了让调试过程更简单,我只设置了 if 条件,以便在 ts.Seconds = 10 时它只响一次。当我按下重置按钮,并且 ts.Seconds 再次从 0 变为 10 时,它应该只响一次,但此时它响了好多次,出乎意料。
我的音效代码是:
private void btnSound_Click_1(object sender, RoutedEventArgs e)
{
Stream stream = TitleContainer.OpenStream("sounds/Ding.wav");
SoundEffect effect = SoundEffect.FromStream(stream);
FrameworkDispatcher.Update();
effect.Play();
}
更新显示函数被调用:
timer = new Timer(new TimerCallback(updateDisplay), textblockTimer, 0, 100);
发生的情况是,如果我将 TimerCallBack 周期切换到较低的值(例如这里看到的 100),SoundEffect 将播放多次,非常快。如果我将 TimerCallBack 增加到更高的值,例如 500,SoundEffect 将播放 2-3 次,有时很快有时会有大约 200 毫秒的延迟。
我的想法已经用完了......我不知道当我将布尔值指定为真时如何播放声音,从而阻止它执行。任何帮助都感激不尽。
(stopRing 定义在代码之上)
编辑:还有几件事要补充:第一轮,SoundEffect 通常播放得很好(只有一次)。但是如果我按下重置按钮并再试一次,大多数情况下 SoundEffect 会播放多次,有时还可以。
这是我的重置按钮代码:
private void btnReset_Click(object sender, RoutedEventArgs e)
{
timeWatch.Stop();
timeWatch.Reset();
paused = true;
btnStartStop.Content = "Start";
textblockTimer.Text = "00:00";
}
和我的开始/停止按钮:
private void btnStartStop_Click(object sender, RoutedEventArgs e)
{
if (paused == true)
{
timeWatch.Start();
timer = new Timer(new TimerCallback(updateDisplay), textblockTimer, 0, 100);
paused = false;
btnStartStop.Content = "Pause";
}
else
{
timeWatch.Stop();
paused = true;
btnStartStop.Content = "Start";
}
}