看起来很简单,但我无法找出任何方法来确定MediaElement的状态。某些状态有各种属性(例如IsBuffering)但我找不到任何状态,如Play,Pause等.Silverlight似乎有一个显示所有这些状态的CurrentState属性。
目前,我正在确定视频是否应该播放的方式是观看各种事件以及检查是否正在进行任何进展的计时器。
我是MediaElement和WPF的新手(我实际上只在WinForms应用程序中使用MediaElement)。有什么我想念的吗?
答案 0 :(得分:30)
你没有遗漏任何东西。您几乎必须手动跟踪媒体是否正在播放。遗憾的是,正如你所提到的,它在Silverlight中非常容易。对我来说似乎是一个重大的疏忽。
答案 1 :(得分:17)
您可以使用反射来访问_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()
方法来解决此问题,这会正确更改状态(可以通过上述方法获取)
答案 2 :(得分:8)
我做了什么来“解决”子类MediaPlayer(这也适用于MediaElement)并将我自己的方法添加到Play / Pause / Stop。在这些方法中,我维护一个表示播放状态的字段。此外,您需要挂钩MediaEnded,以便您可以将状态从“播放”更改为“已停止”。
答案 3 :(得分:2)
if(YourMediaElementName.CurrentState == MediaElementState.Playing) {
使用此条件检查状态是正在播放还是暂停
答案 4 :(得分:2)
我找到了一个在通用Windows 10平台
上解决的解决方案 if ( yourMediaElement.CurrentState.ToString() == "Playing" ) {
//nou yourMediaElement is playng
}
答案 5 :(得分:1)
基于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;
}
}
答案 6 :(得分:0)
对于WPF使用此:
var playing = player.Position < player.NaturalDuration;
答案 7 :(得分:-1)
对于 WPF MediaElement,以下是我使用的解决方案/解决方法:
bool IsPlaying()
{
var pos1 = wpfMediaElement.Position;
System.Threading.Thread.Sleep(1);
var pos2 = wpfMediaElement.Position;
return pos2 != pos1;
}