C# winform,如何使轨迹栏与声音文件一起移动(增加其值)?
Posted
技术标签:
【中文标题】C# winform,如何使轨迹栏与声音文件一起移动(增加其值)?【英文标题】:C# winform, how to make the track bar move (increase its value) along with a sound file? 【发布时间】:2012-08-01 14:05:46 【问题描述】:在我的表格中,我有一个小型媒体播放器,它非常基本,具有基本的功能 嵌套,上一个,播放,停止,音量增加和轨迹栏。 我可以通过以下代码拖动轨迹栏来寻找歌曲:: (假设track bar的最大值为声音文件的总秒数)
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
事件中,但这没有意义,因为它会在同一个线程上,应用程序会冻结..
我怎样才能让酒吧自行移动?
【问题讨论】:
【参考方案1】:您应该创建一个间隔为 1,000 毫秒的 WinForms Timer
,并在其 Tick
事件中更新跟踪栏。
【讨论】:
+1,特别是确保使用System.Windows.Forms.Timer
以避免进一步的跨线程问题。【参考方案2】:
听起来您已经完成了最困难的部分(将滚动条的长度映射到音频文件的长度)。剩下的很简单。
您可以通过Timer
解决此问题。将间隔设置为某个值(例如 1000 毫秒或 500 毫秒,并在 Tick
中更新滚动条(调用 SeekBar_Scroll
)。对于确切的间隔,请测试并查看看起来最自然的那个。
while 循环可能会占用不必要的 CPU,更不用说锁定应用程序的其余部分了。
要绕过控件更新,您需要检查this SO question。如果是这种情况,您需要检查control.InvokeRequired
并通过Invoke
方法进行设置。
【讨论】:
以上是关于C# winform,如何使轨迹栏与声音文件一起移动(增加其值)?的主要内容,如果未能解决你的问题,请参考以下文章
C# winform中咋实现当文本框获得焦点时,如何切换到中文输入法或英文输入法啊?
C#编写的winform程序使用mono脱离.net框架,调用open方法访问access使程序界面消失