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 @   Alexis  阅读(2650)  评论(9编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2011-09-07 Windows Phone 实用开发技巧(20):ApplicationBar 的Text国际化
点击右上角即可分享
微信分享提示