前言

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

問題描述

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

分析

根據 MSDN 的官方文件中說明,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的話可以這麼做:

Solution

  • Solution1: xaml 文件中宣告 MediaElement 與這些屬性
1
MediaElement Height="200" Name="myMediaRadio" Width="300" AutoPlay="True"

code-behind檔中這樣寫

1
2
3
4
5
6
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 改成這樣:
1
MediaElement Height="200" Name="myMediaRadio" Width="300" AutoPlay="True" Source="{a uri which can play}"

code-behind 檔要多處理一個 MediaOpened 事件

1
2
3
4
void myMediaRadio_MediaOpened(object sender, System.Windows.RoutedEventArgs e)
{
   myMediaRadio.Play();//在 MediaOpened 時執行播放,可以避免因上述因素讓媒體進入其他狀態。
}