2010-03-03 5 views
0

J'ai un MediaElement, mais comment puis-je appeler une fonction quand la propriété "position" de MediaElement change?WPF mediaelement

La position n'est pas DependencyProperty.

+0

voir http://stackoverflow.com/questions/869761/wpf-implementing-a-mediaplayer-audio-video-seeker pour un bon départ – kenwarner

Répondre

0

Je veux juste mettre en place un curseur qui suit la lecture vidéo ... mais la propriété de position n'est pas une propriété de dépendance: s

2

Vous pouvez utiliser un DispatchTimer. Cet article fournit un bon aperçu sur la façon de fonctionner. MediaElement and More with WPF.

Voici un exemple de code que j'ai pris dans un projet sur lequel je travaille. Il montre la position de la vidéo en utilisant un contrôle curseur et permet à l'utilisateur de changer la position. Je suis un peu un débutant aussi, donc il est possible que certains d'entre eux est faux (n'hésitez pas à commenter les problèmes dans la section commentaires :).

private DispatcherTimer mTimer; 
private bool mIsDragging = false; 
private bool mTick = false; 
private void UserControl_Loaded(object sender, RoutedEventArgs e) 
{ 
    medPlayer.Play(); 
    medPlayer.Stop(); 
    mTimer = new DispatcherTimer(); 
    mTimer.Interval = TimeSpan.FromMilliseconds(100); 
    mTimer.Tick += new EventHandler(mTimer_Tick); 
    mTimer.Start(); 
} 
void mTimer_Tick(object sender, EventArgs e) 
{ 
    if (!mIsDragging) 
    { 
     try 
     { 
      mTick = true; 
      sldPosition.Value = medPlayer.Position.TotalMilliseconds; 
     } 
     finally 
     { 
      mTick = false; 
     } 
    } 
} 
private void sldPosition_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e) 
{ 
    mIsDragging = true; 
    medPlayer.Pause(); 
} 
private void sldPosition_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e) 
{ 
    mIsDragging = false; 
    if (chkPlay.IsChecked.Value) 
     medPlayer.Play(); 
} 
private void sldPosition_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
{ 
    var pos = TimeSpan.FromMilliseconds(e.NewValue); 
    lblPosition.Content = string.Format("{0:00}:{1:00}", pos.Minutes, pos.Seconds); 
    if (!mTick) 
    { 
     medPlayer.Position = TimeSpan.FromMilliseconds(sldPosition.Value); 
     if (medPlayer.Position == medPlayer.NaturalDuration.TimeSpan) 
     { 
      chkPlay.IsChecked = false; 
      medPlayer.Stop(); 
     } 
    } 
} 
Questions connexes