1

在我的表格中,我有一个小型媒体播放器,它非常基本,它具有基本的功能嵌套、上一个、播放、停止、音量增加和一个轨迹栏。我可以通过以下代码通过拖动轨迹栏来寻找歌曲:: (假设轨迹栏的最大值是声音文件的总秒数)

private void SeekBar_Scroll(object sender, EventArgs e)
{
   Player.Position = TimeSpan.FromSeconds(SeekBar.Value);
} 

但是当音乐播放时我无法让酒吧自行前进..我想出了这个想法:

假设我们有一首 90 秒时长的歌曲。现在轨迹条最大值为 100,因此:100 --> 90 1 --> X X = 0.9 秒 这是条的刻度之间的间隔,以及轨迹条值应在每个刻度中增加的值。这是我的代码:

while (SeekBar.Value < 100)
{
  System.Windows.Duration duration = Player.NaturalDuration;
  SeekBar.Value += duration.TimeSpan.Seconds / 100;
  Thread.Sleep(duration.TimeSpan.Seconds * 10);
}

现在我认为这应该在单独的线程中运行,对吗?但是问题是,当我这样做时,我收到一条恼人的消息,说 TrackBar 正在一个线程中使用,而不是在它创建的线程中使用.. 我该如何解决这个问题?

我想把这段代码放在MouseLeaveMouseEnter事件中,但这没有意义,因为它将在同一个线程上,应用程序将冻结..

我怎样才能让酒吧自行移动?

4

2 回答 2

3

您应该创建一个Timer间隔为 1,000 毫秒的 WinForms,并在其Tick事件中更新跟踪栏。

于 2012-08-01T14:08:58.293 回答
2

听起来您已经完成了最难的部分(将滚动条的长度映射到音频文件的长度)。其余的很容易。

您可以使用Timer. 将间隔设置为某个值(例如 1000 毫秒或 500 毫秒,然后在 中Tick,更新滚动条(调用SeekBar_Scroll)。对于确切的间隔,测试并查看看起来最自然的部分。

while 循环可能会占用不必要的 CPU,更不用说锁定应用程序的其余部分了。

要绕过控件更新,您需要检查这个 SO question。如果是这种情况,您需要通过该方法检查control.InvokeRequired并设置它。Invoke

于 2012-08-01T14:09:24.717 回答