微軟的Microsoft.Xna.Framework.Media元件中自帶有MediaPlayer的庫,其中庫裡面存放有三首曲子,我們可以通過引 用該元件來調用庫中相應的函數進行歌曲播放,通過引用Microsoft.Xna.Framework.dll,引用該命名空間即可使用該 元件。
29172258_8Yta  



如上圖,有四個控制項,一個圖片控制項,一個文本控制項,兩個控制按鈕。當頁面被導航進來時,得到一個Song類型的歌曲,並為文本控制項賦值歌曲名稱。得到類型後,在頁面初始完成時,得到一張歌曲的封面並為圖片控制項賦值。下面是整個應的代碼:
 
 
001 using System;

002 using System.Collections.Generic;

003 using System.Linq;

004 using System.Net;

005 using System.Windows;

006 using System.Windows.Controls;

007 using System.Windows.Documents;

008 using System.Windows.Input;

009 using System.Windows.Media;

010 using System.Windows.Media.Animation;

011 using System.Windows.Shapes;

012 using Microsoft.Phone.Controls;

013 using Microsoft.Xna.Framework;

014 using Microsoft.Xna.Framework.Media;

015 using System.Windows.Threading;

016 using System.IO;

017 using System.Windows.Resources;

018 using System.Windows.Media.Imaging;namespace PostCodeManager

019 {

020 public partial class MainPage : PhoneApplicationPage

021 {

022 #region 成員聲明

023 Song _playSong; //聲明一個Song 類型的變數

024 bool _historyItemLaunch;

025 const String _playSongKey = "playSong";

026 #endregion// Constructor

027 public MainPage()

028 {

029 InitializeComponent();

030 _playSong = null;

031 _historyItemLaunch = false;//聲明一個Timer 使用執行緒運行 XNA internals 來自于微軟XNA框架

032 DispatcherTimer dt = new DispatcherTimer();

033 dt.Interval = TimeSpan.FromMilliseconds(33);

034 //使用委託調用逐幀調用 FrameworkDispatcher.Update();

035 dt.Tick += delegate

036 {

037 try

038 {

039 // 這個函數作用是更新各種XNA元件狀態,並觸發相應的事件,這個是必須的,否則會報異常

040 FrameworkDispatcher.Update();

041

042 }

043 catch

044 {

045

046 throw;

047 }

048 };

049 dt.Start();+= new EventHandler<EventArgs>(MediaPlayer_MediaStateChanged);

050

051 }/// <summary>

052 /// 當頁面進入時調用

053 /// </summary>

054 /// <param name="e"></param>

055 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)

056 {

057 MediaLibrary library = new MediaLibrary();

058 if (NavigationCoNtext.QueryString.ContainsKey(_playSongKey))

059 {

060 String songToPlay = NavigationCoNtext.QueryString[_playSongKey];

061 foreach (Song song in library.Songs)

062 {

063 if (0==String.Compare(songToPlay,song.Name))

064 {

065 _playSong = song;

066 }

067 }

068 _historyItemLaunch = true;

069 }

070 else if (MediaPlayer.State==MediaState.Playing)

071 {

072 _playSong = MediaPlayer.Queue.ActiveSong;

073 }

074 else

075 {

076 Random rd = new Random();

077 if (library.Songs.Count>0)

078 {

079 _playSong = library.Songs[rd.Next(library.Songs.Count)];

080 }

081 else

082 {

083 SongName.Text = "no songs in library";

084 btn_play_music.IsEnabled = false;

085 }

086 }base.OnNavigatedTo(e);

087 }void MediaPlayer_MediaStateChanged(object sender, EventArgs e)

088 {

089 switch (MediaPlayer.State)

090 {

091

092 case MediaState.Playing:

093 btn_play_music.IsEnabled = false;

094 btn_stop.IsEnabled = true;

095 break;

096 case MediaState.Paused:

097 case MediaState.Stopped:

098 btn_play_music.IsEnabled = true;

099 btn_stop.IsEnabled = false;

100 break;

101 }

102 }/// <summary>

103 /// 為主表單添加UI載入完成後的事件

104 /// </summary>

105 /// <param name="sender"></param>

106 /// <param name="e"></param>

107 private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)

108 {

109 PopulateSongMetaData();

110 setInitialButtonState();

111 if (_historyItemLaunch)

112 {

113 playSong();

114 }

115 }

116 /// <summary>

117 /// 開始播放音樂

118 /// </summary>

119 /// <param name="sender"></param>

120 /// <param name="e"></param>

121 private void btn_play_music_Click(object sender, RoutedEventArgs e)

122 {

123 playSong();

124 }/// <summary>

125 /// 停止播放音樂

126 /// </summary>

127 /// <param name="sender"></param>

128 /// <param name="e"></param>

129 private void btn_stop_Click(object sender, RoutedEventArgs e)

130 {

131 stopSong();

132 }/// <summary>

133 /// 播放

134 /// </summary>

135 private void playSong()

136 {

137 if (_playSong!=null)

138 {

139 MediaPlayer.Play(_playSong);

140 }

141 }

142 /// <summary>

143 /// 停止

144 /// </summary>

145 private void stopSong()

146 {

147 if (MediaState.Playing==MediaPlayer.State)

148 {

149 MediaPlayer.Stop();

150 }

151 }/// <summary>

152 /// 使用圖片讀取圖片封面

153 /// </summary>

154 private void PopulateSongMetaData()

155 {

156 if (_playSong!=null)

157 {

158 SongName.Text = _playSong.Name;

159 Stream albumArtStream = _playSong.Album.GetAlbumArt();

160 if (albumArtStream==null)

161 {

162 StreamResourceInfo albumArtPlaceholder = Application.GetResourceStream(new Uri("ApplicationIcon.png", UriKind.Relative));

163 albumArtStream = albumArtPlaceholder.Stream;

164 }

165 BitmapImage albumArtImage = new BitmapImage();

166 albumArtImage.SetSource(albumArtStream);

167 cover.Source = albumArtImage;

168 }

169 }/// <summary>

170 /// 初始化按鈕

171 /// </summary>

172 private void setInitialButtonState()

173 {

174 switch (MediaPlayer.State)

175 {case MediaState.Playing:

176 btn_play_music.IsEnabled = false;

177 btn_stop.IsEnabled = true;

178 break;

179 case MediaState.Paused:

180 case MediaState.Stopped:

181 btn_play_music.IsEnabled = true;

182 btn_stop.IsEnabled = false;

183 break;

184 }

185 }

186

187 MediaPlayer.MediaStateChanged ;

188 }

189 }
TIP:OnNavigatedTo方法是一個重寫系統事件的方法,此方法以檢查導航請求並且準備供顯示的頁面,為一些必要的元件和處理邏輯提供處理任 務,上一篇提到過工程裡面包含有一張圖片為SplashScreenImage.jpg,這張圖片就是就是為處理方法提供的臨時頁面。這個做法好處在於, 使用者會認為程式啟動時和啟動後都是一致的,當我們真正程式啟動完成
後,要做一些頁面其他的載入,就可以在pageLoad 裡面處理。下面為了證實我所說的,來調試一下吧,首先我們在OnNavigatedTo
的入口處加一個中斷點,按F5進入偵錯模式,我們來看看程式是怎麼跑的。如圖:
29172258_9xZQ  


源碼下載 : 猛擊點我
 
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()