微軟的Microsoft.Xna.Framework.Media組件中自帶有MediaPlayer 的庫,其中庫里面存放有三首曲子,我們可以通過引用該組件來調(diào)用庫中相應(yīng)的函數(shù)進(jìn)行歌曲播放,通過引用Microsoft.Xna.Framework.dll ,引用該命名空間即可使用該 組件。
這個(gè)DEMO是一個(gè)音樂播放的小例子,界面如下:
如上圖,有四個(gè)控件,一個(gè)圖片控件,一個(gè)文本控件,兩個(gè)控制按鈕。當(dāng)頁面被導(dǎo)航進(jìn)來時(shí),得到一個(gè)Song 類型的歌曲,并為文本控件賦值歌曲名稱。得到類型后,在頁面初始完成時(shí),得到一張歌曲的封面并為圖片控件賦值。下面是整個(gè)應(yīng)的代碼:
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; // 聲明一個(gè)Song類型的變量
bool _historyItemLaunch;
const String_playSongKey = " playSong " ;
#endregion
// Constructor
public MainPage()
{
InitializeComponent();
_playSong = null ;
_historyItemLaunch = false ;
// 聲明一個(gè)Timer使用線程運(yùn)行XNAinternals來自于微軟XNA框架
DispatcherTimerdt = new DispatcherTimer();
dt.Interval = TimeSpan.FromMilliseconds( 33 );
// 使用委托調(diào)用逐幀調(diào)用FrameworkDispatcher.Update();
dt.Tick += delegate
{
try
{
// 這個(gè)函數(shù)作用是更新各種XNA組件狀態(tài),并觸發(fā)相應(yīng)的事件,這個(gè)是必須的,否則會(huì)報(bào)異常
FrameworkDispatcher.Update();
}
catch
{
throw ;
}
};
dt.Start();
MediaPlayer.MediaStateChanged += new EventHandler < EventArgs > (MediaPlayer_MediaStateChanged);
}
/// <summary>
/// 當(dāng)頁面進(jìn)入時(shí)調(diào)用
/// </summary>
/// <paramname="e"></param>
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgse)
{
MediaLibrarylibrary = new MediaLibrary();
if (NavigationContext.QueryString.ContainsKey(_playSongKey))
{
StringsongToPlay = NavigationContext.QueryString[_playSongKey];
foreach (Songsong 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
{
Randomrd = new Random();
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);
}
void MediaPlayer_MediaStateChanged( object sender,EventArgse)
{
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>
/// <paramname="sender"></param>
/// <paramname="e"></param>
private void PhoneApplicationPage_Loaded( object sender,RoutedEventArgse)
{
PopulateSongMetaData();
setInitialButtonState();
if (_historyItemLaunch)
{
playSong();
}
}
/// <summary>
/// 開始播放音樂
/// </summary>
/// <paramname="sender"></param>
/// <paramname="e"></param>
private void btn_play_music_Click( object sender,RoutedEventArgse)
{
playSong();
}
/// <summary>
/// 停止播放音樂
/// </summary>
/// <paramname="sender"></param>
/// <paramname="e"></param>
private void btn_stop_Click( object sender,RoutedEventArgse)
{
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;
StreamalbumArtStream = _playSong.Album.GetAlbumArt();
if (albumArtStream == null )
{
StreamResourceInfoalbumArtPlaceholder = Application.GetResourceStream( new Uri( " ApplicationIcon.png " ,UriKind.Relative));
albumArtStream = albumArtPlaceholder.Stream;
}
BitmapImagealbumArtImage = 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方法是一個(gè)重寫系統(tǒng)事件的方法,此方法以檢查導(dǎo)航請(qǐng)求并且準(zhǔn)備供顯示的頁面,為一些必要的組件和處理邏輯提供處理任務(wù),上一篇提到過工程里面包含有一張圖片為SplashScreenImage.jpg,這張圖片就是就是為處理方法提供的臨時(shí)頁面。這個(gè)做法好處在于,用戶會(huì)認(rèn)為程序啟動(dòng)時(shí)和啟動(dòng)后都是一致的,當(dāng)我們真正程序啟動(dòng)完成 后,要做一些頁面其他的加載,就可以在pageLoad 里面處理。下面為了證實(shí)我所說的,來調(diào)試一下吧,首先我們?cè)贠nNavigatedTo 的入口處加一個(gè)斷點(diǎn),按F5進(jìn)入調(diào)試模式,我們來看看程序是怎么跑的。如圖:
如圖,重寫這個(gè)方法是不是很不錯(cuò),在Android 我記得是沒有這個(gè)事件可以重寫的,如果有的話,請(qǐng)麻煩告知一聲。謝謝。
那么你還在想什么?趕快動(dòng)手吧,播放一下聽聽。
源碼下載 : 猛擊點(diǎn)我
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

