在做windows phone 開發的時候,有時候我們需要在某些頁面中進行聲音的播放。而播放的方式也有多種:
1. 使用MediaElement
2. 使用SoundEffect
3. 使用後台播放
SoundEffect只能播放wav格式的檔案;後台播放可以在程式退出後仍然繼續播放;MediaElement適用於大多數情況,但不能實現後台播放,MediaElement依賴頁面並且在頁面中只有一個執行個體可以正常工作。
本文講講如何在應用中使用MediaElement作為程式全域播放器,並提供一個協助類。
由於MediaElement依賴於UI,我們不能在ViewModel中建立一個MediaElement執行個體進行聲音的播放,所以我們需要將MediaElement放置在一個UI容器中,下面是協助類的代碼:
public class GlobalPlayer{ static Popup popUp; private static MediaElement _player; public static void Play(string filePath) { popUp = new Popup(); _player = new MediaElement(); _player.Source = null; popUp.Child = _player; popUp.IsOpen = true; try { using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { using (var stream = new IsolatedStorageFileStream(filePath, FileMode.Open, store)) { _player.SetSource(stream); _player.Volume = 1.0; _player.Play(); _player.MediaEnded += new RoutedEventHandler((sender, e) => { stream.Close(); stream.Dispose(); _player.Source = null; _player = null; }); _player.MediaFailed += new EventHandler<ExceptionRoutedEventArgs>((s, args) => { stream.Close(); stream.Dispose(); _player.Source = null; _player = null; }); } } } catch (Exception) { _player.Source = null; _player = null; } } public static void StopPlay() { if (_player != null && _player.CurrentState == MediaElementState.Playing) { try { _player.Source = null; _player.Stop(); } catch (Exception) { //throw; } } }}
使用方法十分簡單,當我們需要在不同的頁面播放同一聲音的時候,將儲存在獨立空間的路徑傳入即可。
Updated 2013-02-28: 我們使用靜態建構函式去初始化MediaElement 和PopUp
static Player() { popUp = new Popup(); _player = new MediaElement(); popUp.Child = _player; popUp.IsOpen = true;
}
public static void Play(string filePath)
{ _player.Source = null; try { using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { using (var stream = new IsolatedStorageFileStream(filePath, FileMode.Open, store)) { _player.SetSource(stream); _player.Volume = 1.0; _player.Play(); _player.MediaEnded += new RoutedEventHandler((sender, e) => { stream.Close(); stream.Dispose(); _player.Source = null; _player = null; }); _player.MediaFailed += new EventHandler<ExceptionRoutedEventArgs>((s, args) => { stream.Close(); stream.Dispose(); _player.Source = null; _player = null; }); } } } catch (Exception) { _player.Source = null; _player = null; } }