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

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

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

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

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

Winows Phone 7 不温不火学习之《音乐播放示例》Winows Phone 7 不温不火学习之《音乐播放示例》代码
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Net;
usingSystem.Windows;
usingSystem.Windows.Controls;
usingSystem.Windows.Documents;
usingSystem.Windows.Input;
usingSystem.Windows.Media;
usingSystem.Windows.Media.Animation;
usingSystem.Windows.Shapes;
usingMicrosoft.Phone.Controls;
usingMicrosoft.Xna.Framework;
usingMicrosoft.Xna.Framework.Media;
usingSystem.Windows.Threading;
usingSystem.IO;
usingSystem.Windows.Resources;
usingSystem.Windows.Media.Imaging;


namespacePostCodeManager
{
publicpartialclassMainPage:PhoneApplicationPage
{
#region成员声明
Song_playSong;
//声明一个Song类型的变量
bool_historyItemLaunch;
constString_playSongKey="playSong";
#endregion


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

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

}
catch
{

throw;
}
};
dt.Start();

MediaPlayer.MediaStateChanged
+=newEventHandler<EventArgs>(MediaPlayer_MediaStateChanged);

}

///<summary>
///当页面进入时调用
///</summary>
///<paramname="e"></param>
protectedoverridevoidOnNavigatedTo(System.Windows.Navigation.NavigationEventArgse)
{
MediaLibrarylibrary
=newMediaLibrary();
if(NavigationContext.QueryString.ContainsKey(_playSongKey))
{
StringsongToPlay
=NavigationContext.QueryString[_playSongKey];
foreach(Songsonginlibrary.Songs)
{
if(0==String.Compare(songToPlay,song.Name))
{
_playSong
=song;
}
}
_historyItemLaunch
=true;
}
elseif(MediaPlayer.State==MediaState.Playing)
{
_playSong
=MediaPlayer.Queue.ActiveSong;
}
else
{
Randomrd
=newRandom();
if(library.Songs.Count>0)
{
_playSong
=library.Songs[rd.Next(library.Songs.Count)];
}
else
{
SongName.Text
="nosongsinlibrary";
btn_play_music.IsEnabled
=false;
}
}


base.OnNavigatedTo(e);
}

voidMediaPlayer_MediaStateChanged(objectsender,EventArgse)
{
switch(MediaPlayer.State)
{

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

///<summary>
///为主窗体添加UI加载完成后的事件
///</summary>
///<paramname="sender"></param>
///<paramname="e"></param>
privatevoidPhoneApplicationPage_Loaded(objectsender,RoutedEventArgse)
{
PopulateSongMetaData();
setInitialButtonState();
if(_historyItemLaunch)
{
playSong();
}
}


///<summary>
///开始播放音乐
///</summary>
///<paramname="sender"></param>
///<paramname="e"></param>
privatevoidbtn_play_music_Click(objectsender,RoutedEventArgse)
{
playSong();
}

///<summary>
///停止播放音乐
///</summary>
///<paramname="sender"></param>
///<paramname="e"></param>
privatevoidbtn_stop_Click(objectsender,RoutedEventArgse)
{
stopSong();
}

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

///<summary>
///使用图片读取图片封面
///</summary>
privatevoidPopulateSongMetaData()
{
if(_playSong!=null)
{
SongName.Text
=_playSong.Name;
StreamalbumArtStream
=_playSong.Album.GetAlbumArt();
if(albumArtStream==null)
{
StreamResourceInfoalbumArtPlaceholder
=Application.GetResourceStream(newUri("ApplicationIcon.png",UriKind.Relative));
albumArtStream
=albumArtPlaceholder.Stream;
}
BitmapImagealbumArtImage
=newBitmapImage();
albumArtImage.SetSource(albumArtStream);
cover.Source
=albumArtImage;
}
}

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

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



}
}

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

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

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

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

源码下载 :猛击点我