Как определить, играет ли 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
}
и на основе 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;
}