WPF: Implementando um MediaPlayer Audio / Video Seeker

Atualmente estou trabalhando em um MP3 player (em um aplicativo WPF) com um MediaPlayer WPF e, basicamente, eu quero implementar um Song Seeker que se move junto com a música atual.

Eu já implementei um slider de música (do aplicativo de Sacha Barber ) e ele funciona quando o usuário arrasta o buscador manualmente (como em, a música continua daquela posição) mas eu não consigo descobrir como fazer o buscador se mover de acordo com a posição atual a música.

O problema é que eu não acho que há uma maneira de verificar quando a propriedade Position do MediaPlayer mudou, então estou perplexo quanto à forma como devo implementar esse recurso.

Alguma idéia de como lidar com esse problema?

[Atualizar]

No que diz respeito ao incremento do buscador com um timer, eu realmente pensei em usar a razão que eu não tentei ainda é porque eu acho que há uma maneira melhor de implementar isso usando o MediaTimeline … mas eu ainda estou para descobrir como .

RESPONDA resposta! e sirva seu mestre

OK, eu descobri como trabalhar isso. Tenho certeza de que não estou fazendo da maneira correta, mas funciona.

Aqui está o code-behind de um aplicativo WPF, com um botão Pause / Play.

 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(); } } 

O truque é que depois de definir o relógio de um MediaPlayer, ele se torna relógio controlado, assim, o uso de MPlayer.Clock.Controller para fazer todo o controle 🙂

Nunca joguei com o media player, mas supondo que você saiba a duração da música, você não poderia configurar um timer que funcione a cada segundo enquanto a música estiver tocando. Portanto, para cada carrapato, basta incrementar o buscador em relação a quanto tempo a música é no total.

A música tem 100 segundos de duração. Portanto, cada segundo / tick vale 1% do progresso total.

Você teria que parar o cronômetro ao pausar a música, etc …

MediaElement tem uma propriedade de posição que você pode usar para isso: http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.position.aspx

Você já verificou o WPF MediaKit ?