我目前正在制作一个带有WPF MediaPlayer
的MP3播放器(在WPF应用程序中),基本上,我想实现一个与当前播放歌曲一起移动的歌曲搜索器。
我已经实现了一个歌曲滑块(来自Sacha Barber's application),当用户手动拖动导引头时(例如,歌曲从该位置继续),它可以正常工作但我无法弄清楚如何使导引头移动到了歌曲中的当前位置。
麻烦是我认为没有办法检查Position
的{{1}}属性何时发生了变化,所以我对如何实现此功能感到难过。
关于如何解决这个问题的任何想法?
[更新]
关于使用计时器增加导引头的问题,我实际上想到了使用我没有尝试过的原因,因为我认为有一种更好的方法可以使用MediaPlayer
来实现...但是我还没弄明白怎么做。
答案 0 :(得分:4)
ARISE回答!并为你的主人服务
好的,我已经弄明白了如何解决这个问题。我确信我没有采用完全正确的方式,但确实有效。
这是WPF应用程序的代码隐藏,带有暂停/播放按钮。
public partial class Main : Window
{
MediaPlayer MPlayer;
MediaTimeline MTimeline;
public Main()
{
InitializeComponent();
var uri = new Uri("C:\\Test.mp3");
MPlayer = new MediaPlayer();
MTimeline = new MediaTimeline(uri);
MTimeline.CurrentTimeInvalidated += new EventHandler(MTimeline_CurrentTimeInvalidated);
MPlayer.Clock = MTimeline.CreateClock(true) as MediaClock;
MPlayer.Clock.Controller.Stop();
}
void MTimeline_CurrentTimeInvalidated(object sender, EventArgs e)
{
Console.WriteLine(MPlayer.Clock.CurrentTime.Value.TotalSeconds);
}
private void btnPlayPause_Click(object sender, RoutedEventArgs e)
{
//Is Active
if (MPlayer.Clock.CurrentState == ClockState.Active)
{
//Is Paused
if (MPlayer.Clock.CurrentGlobalSpeed == 0.0)
MPlayer.Clock.Controller.Resume();
else //Is Playing
MPlayer.Clock.Controller.Pause();
}
else if (MPlayer.Clock.CurrentState == ClockState.Stopped) //Is Stopped
MPlayer.Clock.Controller.Begin();
}
}
诀窍是,一旦你设置了MediaPlayer的时钟,它就会被时钟控制,因此使用MPlayer.Clock.Controller来做所有的控制:)
答案 1 :(得分:0)
从未使用过媒体播放器,但假设您知道歌曲的长度,您可能无法设置在播放歌曲时每秒钟滴答的计时器。因此,对于每个节拍,只需将寻道器与歌曲的总长度相关联。
歌曲长达100秒。因此,每秒/刻度值占总进度的1%。
暂停歌曲等时你必须停止计时器......
答案 2 :(得分:0)
MediaElement有一个可用于此的位置属性:http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.position.aspx
答案 3 :(得分:0)
你有没有检查过WPF MediaKit?