以我的形式,我有一个小型媒体播放器,它非常基础,它有基本的功能主义者 巢,前,播放,停止,音量增加和轨迹栏。 我可以通过以下代码拖动轨道栏来寻找这首歌:: (假设轨迹栏的最大值是声音文件的总秒数)
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正在一个线程中使用,而不是它创建的线程。 我怎么能绕过那个?
我想将此代码放在MouseLeave
和MouseEnter
事件中,但它没有意义,因为它将在同一个线程上,应用程序将冻结..
如何让酒吧自行移动?
答案 0 :(得分:3)
您应该创建一个间隔为1,000毫秒的WinForms Timer
,并在其Tick
事件中更新跟踪栏。
答案 1 :(得分:2)
听起来你完成了最困难的部分(将滚动条的长度映射到音频文件的长度)。其余的很容易。
您可以使用Timer
解决此问题。将间隔设置为某个值(例如1000毫秒或者500毫秒,并在Tick
中,更新滚动条(调用SeekBar_Scroll
)。对于确切的间隔,请测试并查看看起来最自然的内容。
while循环可能会占用不必要的CPU,更不用说锁定应用程序的其余部分了。
要绕过控件更新,您需要检查this SO question。如果是这种情况,您需要检查control.InvokeRequired
并通过Invoke
方法进行设置。