Silverlight本身提供了多媒體播放控件,但並沒有封裝好,可以直接使用的控件。在網上搜索了一些,都不是很適用,有些過於復雜要引用一大堆dll,感覺很臃腫,有些樣式風格不適合。silverlight只提供了MediaElement,並不像以前html那樣現成的直接使用那麼方便,所以就自己封裝一下,做一個滿足基本功能的簡單播放器。通過本篇隨筆認識一下Blend強大的修改控件樣式魔力,和實現一個簡單的播放器。
功能點:
1、播放、暫停及顯示當前播放狀態
2、實時顯示已播放時間
3、播放進度條,並能拖動播放位置
4、全屏按鈕及雙擊播放畫面入或退出全屏
5、調整音量
6、播放列表
播放器的基本功能點就是需求,將需求分解,羅列出實現難點和功能要點,評估工作量及風險。
一、認識MediaElement控件
public MediaElementState CurrentState { get; } MediaElement 的當前狀態。狀態可以為下列值之一(如在 MediaElementState 枚舉中所定義): Buffering、Closed、Opening、Paused、Playing 或 Stopped。 默認值為 Closed。
public bool AutoPlay { get; set; } 如果自動播放,則為 true;否則為 false。默認值為 true。 如果設置 Source 屬性前將此屬性設置為 true,則設置Source屬性時自動播放視頻。
public Uri Source { get; set; } 獲取或設置 MediaElement 上的媒體來源。即指定一個視頻的統一資源標識符 (URI) 字符串。
public double Volume { get; set; } 獲取或設置媒體的音量大小。
//當媒體流已被驗證和打開且已讀取文件頭時發生。在該自定義控件中主要通過該事件獲取視頻的總時長。
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;
}