Как определить, играет ли MediaElement?

кажется достаточно простым, но я не могу понять, как определить, что такое состояние MediaElement. Существуют различные свойства для некоторых состояний (например, IsBuffering), но я не могу найти их для таких состояний, как Play, Pause и т. д. Silverlight, похоже, имеет свойство CurrentState, которое показывает все это.

В настоящее время я определяю, должно ли видео воспроизводиться, наблюдая за различными событиями и таймером, который проверяет, достигнут ли какой-либо прогресс.

Я новичок в MediaElement и WPF (на самом деле я использую только MediaElement в приложении WinForms). Я что-то упускаю?

8 ответов


вы ничего не хватает. Вы в значительной степени должны вручную отслеживать, воспроизводится ли медиа или нет. Жаль, так как это так легко в Silverlight, как вы упомянули. Мне кажется, это большая оплошность.


вы можете получить в _currentState член с помощью отражения.

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

это охватывает воспроизведение / паузу, но не меняется с "play" на "stop", когда он заканчивается.

вы можете обойти это, добавив обработчик событий в MediaEnded событие, а выполняется .Stop() метод, это изменяет статус правильно (который может быть подобран методом выше)


Что я сделал, чтобы "обойти", который был подклассом MediaPlayer (это будет работать и для MediaElement) и добавить свои собственные методы для воспроизведения/паузы/остановки. В этих методах я поддерживаю поле, которое представляет состояние воспроизведения. Кроме того, вам нужно подключить MediaEnded, чтобы вы могли изменить статус с "playing" на "stopped".'


if (YourMediaElementName.CurrentState == MediaElementState.Играющий) {

используйте это условие, чтобы проверить, воспроизводится ли состояние или пауза


Я нашел одно решение, которое woking on Универсальная Платформа Windows 10 :

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

для WPF используйте это: var playing = player.Position < player.NaturalDuration;


и на основе Rich s расширение может быть реализовано

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

на WPF MediaElement, вот решение / обходной путь, который я использую:

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

    return pos2 != pos1;
}