Winows Phone 7 不温不火学习之《音乐播放示例》

简介:

微软的Microsoft.Xna.Framework.Media组件中自带有MediaPlayer 的库,其中库里面存放有三首曲子,我们可以通过引用该组件来调用库中相应的函数进行歌曲播放,通过引用Microsoft.Xna.Framework.dll ,引用该命名空间即可使用该 组件。  

  这个DEMO是一个音乐播放的小例子,界面如下:

 

如上图,有四个控件,一个图片控件,一个文本控件,两个控制按钮。当页面被导航进来时,得到一个Song 类型的歌曲,并为文本控件赋值歌曲名称。得到类型后,在页面初始完成时,得到一张歌曲的封面并为图片控件赋值。下面是整个应的代码:

 

代码
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;
using  Microsoft.Phone.Controls;
using  Microsoft.Xna.Framework;
using  Microsoft.Xna.Framework.Media;
using  System.Windows.Threading;
using  System.IO;
using  System.Windows.Resources;
using  System.Windows.Media.Imaging;


namespace  PostCodeManager
{
    
public   partial   class  MainPage : PhoneApplicationPage
    {
        
#region  成员声明
        Song _playSong; 
// 声明一个Song 类型的变量
         bool  _historyItemLaunch;
        
const  String _playSongKey  =   " playSong " ;
        
#endregion


        
//  Constructor
         public  MainPage()
        {
            InitializeComponent();
            _playSong 
=   null ;
            _historyItemLaunch 
=   false ;

            
// 声明一个Timer 使用线程运行 XNA internals 来自于微软XNA框架
            DispatcherTimer dt  =   new  DispatcherTimer();
            dt.Interval 
=  TimeSpan.FromMilliseconds( 33 );
            
// 使用委托调用逐帧调用  FrameworkDispatcher.Update();
            dt.Tick  +=   delegate
            {
                
try
                {
                    
//  这个函数作用是更新各种XNA组件状态,并触发相应的事件,这个是必须的,否则会报异常
                    FrameworkDispatcher.Update();
                   
                }
                
catch   
                {
                    
                    
throw ;
                }
            };
            dt.Start();

            MediaPlayer.MediaStateChanged 
+=   new  EventHandler < EventArgs > (MediaPlayer_MediaStateChanged);
           
        }

        
///   <summary>
        
///  当页面进入时调用 
        
///   </summary>
        
///   <param name="e"></param>
         protected   override   void  OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            MediaLibrary library 
=   new  MediaLibrary();
            
if  (NavigationContext.QueryString.ContainsKey(_playSongKey))
            {
                String songToPlay 
=  NavigationContext.QueryString[_playSongKey];
                
foreach  (Song song  in  library.Songs)
                {
                    
if  ( 0 == String.Compare(songToPlay,song.Name))
                    {
                        _playSong 
=  song;
                    }
                }
                _historyItemLaunch 
=   true ;
            }
            
else   if  (MediaPlayer.State == MediaState.Playing)
            {
                _playSong 
=  MediaPlayer.Queue.ActiveSong;
            }
            
else
            {
                Random rd 
=   new  Random();
                
if  (library.Songs.Count > 0 )
                {
                    _playSong 
=  library.Songs[rd.Next(library.Songs.Count)];
                }
                
else
                {
                    SongName.Text 
=   " no songs in library " ;
                    btn_play_music.IsEnabled 
=   false ;
                }
            }


            
base .OnNavigatedTo(e);
        }

        
void  MediaPlayer_MediaStateChanged( object  sender, EventArgs e)
        {
            
switch  (MediaPlayer.State)
            {
                
                
case  MediaState.Playing:
                    btn_play_music.IsEnabled 
=   false ;
                    btn_stop.IsEnabled 
=   true ;
                    
break ;
                
case  MediaState.Paused: 
                
case  MediaState.Stopped:
                    btn_play_music.IsEnabled 
=   true ;
                    btn_stop.IsEnabled 
=   false ;
                    
break
            }
        }

        
///   <summary>
        
///  为主窗体添加UI加载完成后的事件
        
///   </summary>
        
///   <param name="sender"></param>
        
///   <param name="e"></param>
         private   void  PhoneApplicationPage_Loaded( object  sender, RoutedEventArgs e)
        {
            PopulateSongMetaData();
            setInitialButtonState();
            
if  (_historyItemLaunch)
            {
                playSong();
            }
        }
        

        
///   <summary>
        
///  开始播放音乐 
        
///   </summary>
        
///   <param name="sender"></param>
        
///   <param name="e"></param>
         private   void  btn_play_music_Click( object  sender, RoutedEventArgs e)
        {
            playSong();
        }

        
///   <summary>
        
///  停止播放音乐
        
///   </summary>
        
///   <param name="sender"></param>
        
///   <param name="e"></param>
         private   void  btn_stop_Click( object  sender, RoutedEventArgs e)
        {
            stopSong();
        }

        
///   <summary>
        
///  播放
        
///   </summary>
         private   void  playSong()
        {
            
if  (_playSong != null )
            {
                MediaPlayer.Play(_playSong);
            }
        }
        
///   <summary>
        
///  停止
        
///   </summary>
         private   void  stopSong()
        {
            
if  (MediaState.Playing == MediaPlayer.State)
            {
                MediaPlayer.Stop();
            }
        }

        
///   <summary>
        
///  使用图片读取图片封面
        
///   </summary>
         private   void  PopulateSongMetaData() 
        {
            
if  (_playSong != null )
            {
                SongName.Text 
=  _playSong.Name;
                Stream albumArtStream 
=  _playSong.Album.GetAlbumArt();
                
if  (albumArtStream == null )
                {
                    StreamResourceInfo albumArtPlaceholder 
=  Application.GetResourceStream( new  Uri( " ApplicationIcon.png " , UriKind.Relative));
                    albumArtStream 
=  albumArtPlaceholder.Stream;
                }
                BitmapImage albumArtImage 
=   new  BitmapImage();
                albumArtImage.SetSource(albumArtStream);
                cover.Source 
=  albumArtImage;
            }
        }

        
///   <summary>
        
///  初始化按钮 
        
///   </summary>
         private   void  setInitialButtonState() 
        {
            
switch  (MediaPlayer.State)
            {

                
case  MediaState.Playing:
                    btn_play_music.IsEnabled 
=   false ;
                    btn_stop.IsEnabled 
=   true ;
                    
break ;
                
case  MediaState.Paused:
                
case  MediaState.Stopped:
                    btn_play_music.IsEnabled 
=   true ;
                    btn_stop.IsEnabled 
=   false ;
                    
break ;
            }
        }

         
         
    }
}

 

 

TIP:OnNavigatedTo方法是一个重写系统事件的方法,此方法以检查导航请求并且准备供显示的页面,为一些必要的组件和处理逻辑提供处理任务,上一篇提到过工程里面包含有一张图片为SplashScreenImage.jpg,这张图片就是就是为处理方法提供的临时页面。这个做法好处在于,用户会认为程序启动时和启动后都是一致的,当我们真正程序启动完成 后,要做一些页面其他的加载,就可以在pageLoad 里面处理。下面为了证实我所说的,来调试一下吧,首先我们在OnNavigatedTo 的入口处加一个断点,按F5进入调试模式,我们来看看程序是怎么跑的。如图:

如图,重写这个方法是不是很不错,在Android 我记得是没有这个事件可以重写的,如果有的话,请麻烦告知一声。谢谢。

 

那么你还在想什么?赶快动手吧,播放一下听听。

源码下载 :猛击点我

如果你觉得对你有帮助,或许你现在有空闲,麻烦你能移下步子帮我投下票,感觉不尽:传送门





 本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/456646,如需转载请自行联系原作者




相关文章
|
JSON Android开发 图形学
修行Android Studio技巧到出神入化,快速涨薪-【预览列表】、【Null判断】篇
众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过程中会产生很多对于人生的质疑和思考,于是我决定将自己的思考,经验和故事全部分享出来,以此寻找共鸣!!!
158 0
|
API C#
艾伟:C#对游戏手柄的编程开发-API篇(2)
回顾“被动方式”开发 在C#对游戏手柄的编程开发-API篇(1)这篇文章中我们介绍了“被动方式”的开发。在此方式下,我们的程序只扮演一个消息接收者。系统会定时告诉我们某个游戏手柄当前的状态,我们的程序接收到后再按实际需要进行处理即可。
1647 0
|
Windows C#
UWP开发砸手机系列(二)—— “讲述人”识别自定义控件Command
原文:UWP开发砸手机系列(二)—— “讲述人”识别自定义控件Command   上一篇我们提到如何让“讲述人”读出自定义的CanReadGrid,但“讲述人”仍然无法识别CanReadGrid上绑定的Command。
1502 0