Windows Phone实用开发技巧(37):创建一个全局播放器

在做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;
            
        }
    }

 

posted @ 2012-09-07 15:44  Alexis  阅读(2644)  评论(9编辑  收藏  举报