2012年5月11日 星期五

MediaElement開啟新的Source時的行為

前言:
Silverlight 在多媒體的處理中提供了 MediaElement 這個控制項,可以進行影片的播放、聲音的播放等應用。而串流資訊的來源可以是一個網址列,也可以是一個串流來源。但是若來源固定的話這個應用實在很弱,因此大多的時候來源都是可以隨時變動的。今天在做一些測試的時候有個情境是這樣的:
使用者在 ListBox 中選了一個 Item,而選中後會觸發事件讓 MediaElement 的 Source 重新設定來源,然後就可以直接播放新的 Item 的內容 (不同的 Item 表示不同的 Radio 位址)。

問題描述:
點選 Listbox 的 Item 後會觸發事件,但是程式執行 MediaElement1.Play() 後卻沒有動作。

分析:
根據 MSDN 的官方文件中說明(http://msdn.microsoft.com/en-us/library/cc189079(v=vs.95).aspx),MediaElement 的 Source 在進行變更之後會針對來源進行驗證或是授權(如果有需要的話),接著就會觸發 MediaOpened 事件,不過接著會進行什麼動作則是依據兩個屬性來決定;AutoPlay, CanPause。

Case 1:
若 AutoPlay 是 True。則MediaElement的Source更改後狀態直接進入 Playing 來播放多媒體。

Case 2:
若 AutoPlay 是 False,CanPause 是 True。則Source更改後狀態會進入 Pause。

Case 3:
若兩個屬性都是 False。則 Source 更改後狀態會進入 Stopped。

因此,若想要使用者點選選單然後立刻播放Radio的話可以這麼做:
===================================================
Solution1:
xaml 文件中宣告 MediaElement 與這些屬性
MediaElement Height="200" Name="myMediaRadio" Width="300" AutoPlay="True"
code-behind檔中這樣寫
protected void myRadioList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   var radioname = e.AddedItems[0].ToString();
   myMediaRadio.Source = new Uri(_db.GetRadioUri(radioname), UriKind.Absolute);
   myMediaRadio.Volume = 100;
}

========================================================
Solution2:
xaml 文件中 MediaElement 改成這樣:
MediaElement Height="200" Name="myMediaRadio" Width="300" AutoPlay="True" Source="{a uri which can play}"
code-behind 檔要多處理一個 MediaOpened 事件
void myMediaRadio_MediaOpened(object sender, System.Windows.RoutedEventArgs e)
{
   myMediaRadio.Play();//在 MediaOpened 時執行播放,可以避免因上述因素讓媒體進入其他狀態。
}

===========================================================
以上!