时间:2023-06-02 16:16:41 来源: 人气:
Silverlight本身提供了多媒体播放控件,但并没有封装好,可以直接使用的控件。在网上搜索了一些,都不是很适用,有些过于复杂要引用一大堆dll,感觉很臃肿,有些样式风格不适合。silverlight只提供了MediaElement,并不像以前html那样现成的直接使用那么方便,所以就自己封装一下,做一个满足基本功能的简单播放器。通过本篇随笔认识一下Blend强大的修改控件样式魔力,和实现一个简单的播放器。,功能点:,1、播放、暂停及显示当前播放状态,2、实时显示已播放时间,3、播放进度条,并能拖动播放位置,4、全屏按钮及双击播放画面入或退出全屏,5、调整音量,6、播放列表,播放器的基本功能点就是需求,将需求分解,罗列出实现难点和功能要点,评估工作量及风险。,一、认识MediaElement控件, ,//当媒体流已被验证和打开且已读取文件头时发生。在该自定义控件中主要通过该事件获取视频的总时长。, ,public event RoutedEventHandler MediaOpened,void mediaElement_MediaOpened(object sender, RoutedEventArgs e),{,this.playTools.TotaPlayTime = (int)this.mediaElement.NaturalDuration.TimeSpan.TotalSeconds;,},//当 MediaElement 不再播放音频或视频时发生。,在该自定义控件中主要通过该事件设置MediaElement为Stop,并判断是否循环播放而进行继续循环播放。,public event RoutedEventHandler MediaEnded,void mediaElement_MediaEnded(object sender, RoutedEventArgs e),{,this.mediaElement.Stop();,if (this.IsReplay),{,this.mediaElement.Play();,},},//当 CurrentState 属性的值更改时发生。在该自定义控件中主要通过该事件显示当前视频播放状态信息。,public event RoutedEventHandler CurrentStateChanged,if (this.mediaElement.CurrentState == MediaElementState.Buffering),{,this.playTools.CurrentMessage = this.mediaElement.CurrentState + "," + Math.Round(this.mediaElement.BufferingProgress * 100, 0).ToString() + "%";,},//在存在与媒体 Source 关联的错误时发生。MediaFailed 事件可在下列条件下发生:,1、未找到文件。,2、无效的(无法识别的或不支持的)媒体格式。,3、播放期间未知的媒体错误。,//在该自定义控件中主要通过该事件显示错误信息。,public event EventHandler MediaFailed,void mediaElement_MediaFailed(object sender, ExceptionRoutedEventArgs e),{,this.playTools.CurrentMessage = e.ErrorException.Message;,},//该事件是播放时发生,用于获取当前已播放时间,CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);,void CompositionTarget_Rendering(object sender, EventArgs e),{,int currentTime = (int)this.mediaElement.Position.TotalSeconds;,this.playTools.CurrentPlayTime = currentTime;,}, ,