Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I determine if MediaElement is playing?

Seems simple enough, but I cannot figure out any way to determine what the state of a MediaElement is. There are various properties for some states (such as IsBuffering) but I can't find any for states such as Play, Pause, etc. Silverlight seems to have a CurrentState property that shows all these.

Currently the way I'm determining whether a video is supposed to be playing is watching for various events and a timer that checks to see if any progress is being made.

I'm new to MediaElement and WPF (I'm actually only using MediaElement in a WinForms app). Is there something I am missing?

like image 520
Brian Avatar asked Dec 02 '10 19:12

Brian


3 Answers

You aren't missing anything. You pretty much have to manually keep track of whether or not the media is playing. It's a pity, since it is so easy in Silverlight, as you mention. Seems like a major oversight to me.

like image 199
PeterL Avatar answered Nov 03 '22 14:11

PeterL


You can get at the _currentState member using reflection.

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

This covers play/pause, but doesn't change from 'play' to 'stop' when it finishes.

You can get around this by adding an event handler to the MediaEnded event, and running the .Stop() method, this changes the status correctly (which can be picked up by the method above)

like image 40
Rich S Avatar answered Nov 03 '22 16:11

Rich S


What I did to "work around" that was subclass MediaPlayer (this would work for MediaElement as well) and add my own methods to Play/Pause/Stop. In those methods, I maintain a field which represents the playback status. Also, you need to hook MediaEnded so that you can change the status from 'playing' to 'stopped.'

like image 9
Friend Avatar answered Nov 03 '22 16:11

Friend