您的位置:首页 > 其它

图解使用Win8Api进行Metro风格的程序开发十----音乐播放

2012-06-21 09:43 579 查看
我们紧接着上篇,这篇将介绍如何使用Windows.UI.Xaml.Media API
中的MediaControl全部事件和MediaElement控件的功能
-----------------------------------我是华丽的分割线-----------------------------------------
我们紧接着上篇,这篇将使用Windows.UI.Xaml.Media API 中的MediaControl全部事件和MediaElement控件的功能

本篇将介绍如下九个方面:
  a)MediaControl.PlayPauseTogglePressed事件
  b)MediaControl.PlayPressed事件
  c)MediaControl.PausePressed事件
  d)MediaControl.StopPressed事件
  e)MediaControl.FastForwardPressed事件
  f)MediaControl.RewindPressed事件
  g)MediaControl.RecordPressed事件
  h)MediaControl.ChannelDownPressed事件
  i)MediaControl.ChannelUpPressed事件

我们的创建的步骤如下:
  1)为了组织文件方便,我们先建一个文件夹MediaButtons
  2)向文件夹中添加如下文件:
    MediaEvents.xaml
    创建方法请参照前一篇.
  3)由于我们需要对选择的歌曲进行操作,我们要新建一个Song类:

View Code

public sealed partial class MediaEvents : Page
{
int currentSongIndex = 0;
int playlistCount = 0;
bool previousRegistered = false;
bool nextRegistered = false;
bool wasPlaying = false;
ObservableCollection<Song> playlist = new ObservableCollection<Song>();

public MediaEvents()
{
this.InitializeComponent();

DefaultOption.Click += DefaultOption_Click;

MediaControl.PlayPauseTogglePressed += MediaControl_PlayPauseTogglePressed;
MediaControl.PlayPressed += MediaControl_PlayPressed;
MediaControl.PausePressed += MediaControl_PausePressed;
MediaControl.StopPressed += MediaControl_StopPressed;

MediaControl.FastForwardPressed += MediaControl_FastForwardPressed;
MediaControl.RewindPressed += MediaControl_RewindPressed;
MediaControl.RecordPressed += MediaControl_RecordPressed;
MediaControl.ChannelDownPressed += MediaControl_ChannelDownPressed;
MediaControl.ChannelUpPressed += MediaControl_ChannelUpPressed;

PlayButton.Click += new RoutedEventHandler(MediaControl_PlayPauseTogglePressed);
mediaElement.CurrentStateChanged += mediaElement_CurrentStateChanged;
mediaElement.MediaOpened += mediaElement_MediaOpened;
mediaElement.MediaEnded += mediaElement_MediaEnded;

SongListView.SelectionChanged += SongListView_SelectionChanged;

OutputTextBlock.Text = "Events Registered";
}

async void SongListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Song song = e.AddedItems[0] as Song;
if (song != null)
{
await SetMediaElementSourceAsync(song);
}

await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
mediaElement.AutoPlay = true;
});
await dispatchMessage("Play/Pause Pressed - Play");
}

/// <summary>
/// Invoked when this page is about to be displayed in a Frame.
/// </summary>
/// <param name="e">Event data that describes how this page was reached.  The Parameter
/// property is typically used to configure the page.</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
}

async void DefaultOption_Click(object sender, RoutedEventArgs e)
{
FileOpenPicker openPicker = new FileOpenPicker();
openPicker.ViewMode = PickerViewMode.List;
openPicker.SuggestedStartLocation = PickerLocationId.MusicLibrary;
openPicker.FileTypeFilter.Add(".mp3");
openPicker.FileTypeFilter.Add(".m4a");
openPicker.FileTypeFilter.Add(".wma");
//选择多个文件
IReadOnlyList<StorageFile> files = await openPicker.PickMultipleFilesAsync();
if (files.Count > 0)
{
//创建播放列表
await createPlaylist(files);
//设置当前播放歌曲
await SetCurrentPlayingAsync(currentSongIndex);
}
}
//播放结束,设置下一首
async void mediaElement_MediaEnded(object sender, RoutedEventArgs e)
{
if (currentSongIndex < playlistCount - 1)
{
currentSongIndex++;

await SetCurrentPlayingAsync(currentSongIndex);
if (wasPlaying)
{
mediaElement.Play();
}
}
}
//开始播放
void mediaElement_MediaOpened(object sender, RoutedEventArgs e)
{
if (wasPlaying)
{
mediaElement.Play();
}
}

void mediaElement_CurrentStateChanged(object sender, RoutedEventArgs e)
{
if (mediaElement.CurrentState == MediaElementState.Playing)
{
MediaControl.IsPlaying = true;
PlayButton.Content = "Pause";
}
else
{
MediaControl.IsPlaying = false;
PlayButton.Content = "Play";
}
}

//设置要播放的歌曲
async Task SetMediaElementSourceAsync(Song song)
{
var stream = await song.File.OpenAsync(Windows.Storage.FileAccessMode.Read);
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { mediaElement.SetSource(stream, song.File.ContentType); });
MediaControl.ArtistName = song.Artist;
MediaControl.TrackName = song.Track;
}

//创建播放列表
async Task createPlaylist(IReadOnlyList<StorageFile> files)
{
playlistCount = files.Count;

//注销事件关联
if (previousRegistered)
{
MediaControl.PreviousTrackPressed -= MediaControl_PreviousTrackPressed;
previousRegistered = false;
}
if (nextRegistered)
{
MediaControl.NextTrackPressed -= MediaControl_NextTrackPressed;
nextRegistered = false;
}
//设置当前播放歌曲
currentSongIndex = 0;
//清空播放列表
playlist.Clear();

if (files.Count > 0)
{
if (files.Count > 1)
{
//注册下一曲事件
MediaControl.NextTrackPressed += MediaControl_NextTrackPressed;
nextRegistered = true;
}

// 创建播放列表
foreach (StorageFile file in files)
{
Song newSong = new Song(file);
await newSong.getMusicPropertiesAsync();
playlist.Add(newSong);
}

SongListView.ItemsSource = playlist;
}
}

async Task SetCurrentPlayingAsync(int playlistIndex)
{
string errorMessage = null;
wasPlaying = MediaControl.IsPlaying;
Windows.Storage.Streams.IRandomAccessStream stream = null;

try
{
stream = await playlist[playlistIndex].File.OpenAsync(Windows.Storage.FileAccessMode.Read);
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { mediaElement.SetSource(stream, playlist[playlistIndex].File.ContentType); });
}
catch (Exception e)
{
errorMessage = e.Message;
}

if (errorMessage != null)
{
await dispatchMessage("Error" + errorMessage);
}

MediaControl.ArtistName = playlist[playlistIndex].Artist;
MediaControl.TrackName = playlist[playlistIndex].Track;
}

async void MediaControl_ChannelUpPressed(object sender, object e)
{
await dispatchMessage("Channel Up Pressed");
}

async void MediaControl_ChannelDownPressed(object sender, object e)
{
await dispatchMessage("Channel Down Pressed");
}

async void MediaControl_RecordPressed(object sender, object e)
{
await dispatchMessage("Record Pressed");
}

async void MediaControl_RewindPressed(object sender, object e)
{
await dispatchMessage("Rewind Pressed");
}

async void MediaControl_FastForwardPressed(object sender, object e)
{
await dispatchMessage("Fast Forward Pressed");
}

async void MediaControl_PreviousTrackPressed(object sender, object e)
{
await dispatchMessage("Previous Track Pressed");
if (currentSongIndex > 0)
{
if (currentSongIndex == (playlistCount - 1))
{
if (!nextRegistered)
{
MediaControl.NextTrackPressed += MediaControl_NextTrackPressed;
nextRegistered = true;
}
}
currentSongIndex--;

if (currentSongIndex == 0)
{
MediaControl.PreviousTrackPressed -= MediaControl_PreviousTrackPressed;
previousRegistered = false;
}

await SetCurrentPlayingAsync(currentSongIndex);
}

}

async void MediaControl_NextTrackPressed(object sender, object e)
{
await dispatchMessage("Next Track Pressed");

if (currentSongIndex < (playlistCount - 1))
{
currentSongIndex++;
await SetCurrentPlayingAsync(currentSongIndex);
if (currentSongIndex > 0)
{
if (!previousRegistered)
{
MediaControl.PreviousTrackPressed += MediaControl_PreviousTrackPressed;
previousRegistered = true;
}

}
if (currentSongIndex == (playlistCount - 1))
{
if (nextRegistered)
{
MediaControl.NextTrackPressed -= MediaControl_NextTrackPressed;
nextRegistered = false;
}
}
}

}

async void MediaControl_StopPressed(object sender, object e)
{

await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
mediaElement.Stop();
});

await dispatchMessage("Stop Pressed");
}

async void MediaControl_PausePressed(object sender, object e)
{
await dispatchMessage("Pause Pressed");
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
mediaElement.Pause();
});
}

async void MediaControl_PlayPressed(object sender, object e)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
mediaElement.Play();
});
await dispatchMessage("Play Pressed");
}

async void MediaControl_PlayPauseTogglePressed(object sender, object e)
{
if (MediaControl.IsPlaying)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
mediaElement.Pause();
});
await dispatchMessage("Play/Pause Pressed - Pause");
}
else
{

await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
mediaElement.Play();
});
await dispatchMessage("Play/Pause Pressed - Play");
}

}

async Task dispatchMessage(string message)
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
OutputTextBlock.Text = getTimeStampedMessage(message);
});
}
//播放进度
string getTimeStampedMessage(string eventText)
{
return eventText + "   " + DateTime.Now.Hour.ToString() + ":" + DateTime.Now.Minute.ToString() + ":" + DateTime.Now.Second.ToString();
}
}


  修改Package.appxmanifest:



  8)请看效果图:

  选择文件后:



  点击 play或者点击歌曲,将播放音乐.按下音乐键:



未完待续,敬请期待...
转载请注明出处:http://www.cnblogs.com/refactor/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: