看起来很简单,但我找不到任何方法来确定MediaElement的状态。虽然有一些状态(如IsBuffering)的属性,但我找不到任何关于Play、Pause等状态的属性。Silverlight似乎有一个CurrentState属性可以显示所有这些状态。
目前,我确定视频是否应该播放的方式是观察各种事件和检查是否有任何进度的计时器。
我对MediaElement和WPF都很陌生(实际上我只是在一个WinForms应用程序中使用MediaElement)。我是否漏掉了什么?
看起来很简单,但我找不到任何方法来确定MediaElement的状态。虽然有一些状态(如IsBuffering)的属性,但我找不到任何关于Play、Pause等状态的属性。Silverlight似乎有一个CurrentState属性可以显示所有这些状态。
目前,我确定视频是否应该播放的方式是观察各种事件和检查是否有任何进度的计时器。
我对MediaElement和WPF都很陌生(实际上我只是在一个WinForms应用程序中使用MediaElement)。我是否漏掉了什么?
您没有错过任何东西。您几乎必须手动跟踪媒体是否正在播放。很遗憾,因为正如您所提到的那样,在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;
}
这涵盖了播放/暂停,但在完成时不会从“播放”更改为“停止”。
您可以通过向MediaEnded
事件添加事件处理程序,并运行.Stop()
方法来解决此问题,这样可以正确更改状态(可以通过上面的方法检测到)。
我为了“解决”这个问题,子类化了MediaPlayer(这对于MediaElement也适用),并添加了自己的方法来播放/暂停/停止。在这些方法中,我维护一个表示播放状态的字段。此外,您需要挂钩MediaEnded以便可以将状态从“正在播放”更改为“已停止”。
对于 通用 Windows 10 平台 (UWP)
:
if ( yourMediaElement.CurrentState.ToString() == "Playing" )
{
//nou yourMediaElement is playng
}
枚举
,可以选择以下内容:if (yourMediaElement.CurrentState == MediaElementState.Playing)
{
//nou yourMediaElement is playng
}
//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;
}
}
对于 Silverlight
,使用 CurrentState 来检查状态是否正在播放或暂停。
if (YourMediaElementName.CurrentState == MediaElementState.Playing)
{
// TODO: when media is playing.
}
CurrentState
只适用于 Silverlight。 - erodewald对于WPF的MediaElement,这是我使用的解决方案/变通方法:
bool IsPlaying()
{
var pos1 = wpfMediaElement.Position;
System.Threading.Thread.Sleep(1);
var pos2 = wpfMediaElement.Position;
return pos2 != pos1;
}
var media = (MediaElement)obj;
if (media.CanPause)
{
media.Pause();
}
else
{
media.Play();
}
对于WPF使用以下代码:var playing = player.Position < player.NaturalDuration;