2010-12-02 2 views
20

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

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

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

ответ

23

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

+21

Ну, это отстой ...:/ – Boris 2011-03-10 13:13:31

8

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

+6

Положите его на CodePlex. Если у вас нет времени, я планирую, просто не хочу наступать на все пальцы. – erodewald 2012-03-29 21:38:50

-1

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

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

    return pos2 != pos1; 
} 
+6

Это ужасное обходное решение. Если вы вызовете этот метод в потоке пользовательского интерфейса, весь пользовательский интерфейс будет forzen. – TcKs 2013-04-03 13:31:32

+1

Не используйте такие трюки! – Profet 2013-05-08 18:14:50

+0

Как у этого есть upvotes? – Charlie 2014-01-27 20:23:16

13

Вы можете получить в использовании отражения _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(), это изменяет статус правильно (который может быть подобран по описанной выше методике)

2

если (YourMediaElementName.CurrentState == MediaElementState.Playing) {

использовать это условие для проверки воспроизведения состояния или паузы

2

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

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