ventanas ventana una reproducir otra navegacion form entre dentro abrir wpf mediaelement

wpf - ventana - ¿Cómo puedo determinar si MediaElement se está reproduciendo?



navegacion entre ventanas wpf (8)

Parece bastante simple, pero no puedo encontrar ninguna manera de determinar cuál es el estado de un elemento de elemento de medios. Hay varias propiedades para algunos estados (como IsBuffering) pero no puedo encontrar ninguna para estados como Play, Pause, etc. Silverlight parece tener una propiedad CurrentState que muestra todas estas.

Actualmente, la forma en que estoy determinando si un video se debe reproducir es ver varios eventos y un temporizador que verifica si se está haciendo algún progreso.

Soy nuevo en MediaElement y WPF (en realidad solo uso MediaElement en una aplicación de WinForms). ¿Hay algo que este olvidando?


Encontré una solución que funciona en la plataforma universal de Windows 10 :

if ( yourMediaElement.CurrentState.ToString() == "Playing" ) { //nou yourMediaElement is playng }


Lo que hice para "solucionar" la subclase MediaPlayer (esto también funcionaría para MediaElement) y agregar mis propios métodos para Reproducir / Pausa / Detener. En esos métodos, mantengo un campo que representa el estado de reproducción. Además, debe enlazar MediaEnded para poder cambiar el estado de "reproducción" a "detenido".


No te estás perdiendo nada. Usted prácticamente tiene que realizar un seguimiento manual de si los medios se están reproduciendo o no. Es una pena, ya que es tan fácil en Silverlight, como mencionas. Me parece un gran descuido.


Para WPF MediaElement, aquí está la solución / solución que uso:

bool IsPlaying() { var pos1 = wpfMediaElement.Position; System.Threading.Thread.Sleep(1); var pos2 = wpfMediaElement.Position; return pos2 != pos1; }


Para WPF use esto: var playing = player.Position < player.NaturalDuration;


Y en base a Rich S se puede implementar una extensión.

//don''t forget using System.Windows.Controls; using System.Reflection; public static class Util { public static MediaState GetMediaState(this MediaElement myMedia) { FieldInfo hlp = typeof(MediaElement).GetField("_helper", BindingFlags.NonPublic | BindingFlags.Instance); object helperObject = hlp.GetValue(myMedia); FieldInfo stateField = helperObject.GetType().GetField("_currentState", BindingFlags.NonPublic | BindingFlags.Instance); MediaState state = (MediaState)stateField.GetValue(helperObject); return state; } }


if (YourMediaElementName.CurrentState == MediaElementState.Playing) {

Utilice esta condición para verificar si el estado se está reproduciendo o pausa


Puede obtener en el miembro _currentState utilizando la reflexión.

private MediaState GetMediaState(MediaElement myMedia) { FieldInfo hlp = typeof(MediaElement).GetField("_helper", BindingFlags.NonPublic | BindingFlags.Instance); object helperObject = hlp.GetValue(myMedia); FieldInfo stateField = helperObject.GetType().GetField("_currentState", BindingFlags.NonPublic | BindingFlags.Instance); MediaState state = (MediaState)stateField.GetValue(helperObject); return state; }

Esto cubre la reproducción / pausa, pero no cambia de ''play'' a ''stop'' cuando termina.

Puede MediaEnded esto agregando un controlador de eventos al evento MediaEnded , y ejecutando el método .Stop() , esto cambia el estado correctamente (que puede ser recogido por el método anterior)