Как определить, воспроизводится ли MediaElement? - PullRequest
27 голосов
/ 02 декабря 2010

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

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

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

Ответы [ 8 ]

30 голосов
/ 03 декабря 2010

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

17 голосов
/ 29 мая 2013

Вы можете получить на _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;
    }

Это охватывает воспроизведение / пауза, но не изменяется от «воспроизведения» до «остановки», когда оно заканчивается.

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

8 голосов
/ 26 августа 2011

То, что я сделал, чтобы «обойти» этот подкласс MediaPlayer (это будет работать и для MediaElement), и добавил свои собственные методы в Play / Pause / Stop.В этих методах я поддерживаю поле, которое представляет статус воспроизведения.Кроме того, вам нужно подключить MediaEnded, чтобы вы могли изменить статус с «воспроизведение» на «остановлено».

2 голосов
/ 23 мая 2016

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

 if ( yourMediaElement.CurrentState.ToString() == "Playing" ) {
 //nou yourMediaElement is playng
   }
2 голосов
/ 30 июня 2014

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

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

1 голос
/ 25 мая 2018

А на основе 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;
        }
    }
0 голосов

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

0 голосов
/ 27 октября 2012

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

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

    return pos2 != pos1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...