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 正在一个线程中使用,而不是它创建的线程.. 我该如何解决?

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

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

【问题讨论】:

【参考方案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使程序界面消失

C# Winform如何打开指定的文件夹?

如何使窗口可拖动(C# Winforms)?

C# winform 怎样使制作的卸载程序不删除某些文件,比如access数据库文件

如何使用 Nadio c# 使声音更大?