Ответ 1
Вам ничего не хватает. Вы в значительной степени должны вручную отслеживать, воспроизводится ли медиа. Жаль, так как в Silverlight это так просто, как вы упомянули. Похоже на серьезный надзор для меня.
Кажется, достаточно просто, но я не могу понять, каким образом состояние MediaElement. Существуют различные свойства для некоторых состояний (например, IsBuffering), но я не могу найти их для таких состояний, как Play, Pause и т.д. Silverlight, похоже, имеет свойство CurrentState, которое показывает все это.
В настоящее время способ определения того, должно ли видео воспроизводиться, - наблюдать за различными событиями и таймером, который проверяет, достигнут ли какой-либо прогресс.
Я новичок в MediaElement и WPF (на самом деле я использую MediaElement в приложении WinForms). Что-то мне не хватает?
Вам ничего не хватает. Вы в значительной степени должны вручную отслеживать, воспроизводится ли медиа. Жаль, так как в 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) и добавить мои собственные методы в Play/Pause/Stop. В этих методах я сохраняю поле, которое представляет статус воспроизведения. Кроме того, вам необходимо подключить MediaEnded, чтобы вы могли изменить статус с "воспроизведения" на "остановлено".
if (YourMediaElementName.CurrentState == MediaElementState.Playing) {
используйте это условие, чтобы проверить, воспроизводится ли состояние или приостанавливается
Я нашел одно решение, которое woking на Универсальной платформе Windows 10:
if ( yourMediaElement.CurrentState.ToString() == "Playing" ) {
//nou yourMediaElement is playng
}
Для WPF MediaElement, это решение/обходной путь, который я использую:
bool IsPlaying()
{
var pos1 = wpfMediaElement.Position;
System.Threading.Thread.Sleep(1);
var pos2 = wpfMediaElement.Position;
return pos2 != pos1;
}