Silverlight2 边学边练 之四 音频播放器

众所周知Silverlight2对于音视频媒体也提供了很好的支持,本篇就音频部分做一个播放器实例。
本例实现的是播放器最基本的功能,大家可通过该例体会一下Silverlight2对音频的控制。
本例参考自《Pro Silverlight 2 in C# 2008》CHAPTER 10 SOUND, VIDEO, AND DEEP ZOOM

先上个效果图看看:

2009-7-30-15.12.44

XAML Code:

<UserControl x:Class="MusicPlayer.Page"      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"      Height="250" Width="200">      <Grid Margin="20">          <Grid.Background>              <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">                  <GradientStop Color="Gold" Offset="0"></GradientStop>                  <GradientStop Color="White" Offset="0.5"></GradientStop>                  <GradientStop Color="Gold" Offset="1"></GradientStop>              </LinearGradientBrush>          </Grid.Background>          <Grid.RowDefinitions>              <RowDefinition Height="Auto"></RowDefinition>              <RowDefinition Height="Auto"></RowDefinition>              <RowDefinition Height="Auto"></RowDefinition>              <RowDefinition Height="Auto"></RowDefinition>              <RowDefinition Height="Auto"></RowDefinition>          </Grid.RowDefinitions>            <!--媒体组件-->          <MediaElement x:Name="media" AutoPlay="False" Source="test.mp3"                          MediaOpened="media_MediaOpened"                         MediaFailed="media_MediaFailed"                        MediaEnded="media_MediaEnded"                         CurrentStateChanged="media_CurrentStateChanged">          </MediaElement>          <StackPanel Orientation="Horizontal">              <!--播放键-->              <Button Click="cmdPlay_Click" Padding="15" Margin="5">                  <StackPanel>                      <Polygon Points="0,0 0,10 10,5" Fill="Green"></Polygon>                  </StackPanel>              </Button>              <!--停止键-->              <Button Click="cmdStop_Click" Padding="15" Margin="5">                  <StackPanel>                      <Rectangle Height="10" Width="10" Fill="Red"></Rectangle>                  </StackPanel>              </Button>              <!--暂停键-->              <Button Click="cmdPause_Click" Padding="15" Margin="5">                  <StackPanel Orientation="Horizontal">                      <Rectangle Margin="1" Height="10" Width="3" Fill="Blue"></Rectangle>                      <Rectangle Margin="1" Height="10" Width="3" Fill="Blue"></Rectangle>                  </StackPanel>              </Button>          </StackPanel>            <Grid Grid.Row="1" Margin="0,10,0,0">              <Grid.RowDefinitions>                  <RowDefinition Height="Auto"></RowDefinition>                  <RowDefinition Height="Auto"></RowDefinition>                  <RowDefinition Height="Auto"></RowDefinition>              </Grid.RowDefinitions>              <Grid.ColumnDefinitions>                  <ColumnDefinition Width="Auto"></ColumnDefinition>                  <ColumnDefinition></ColumnDefinition>              </Grid.ColumnDefinitions>                <!--音量调节按钮-->              <TextBlock Margin="5" Text="Volume: "></TextBlock>              <Slider x:Name="sliderVolume" Grid.Column="1"  Minimum="0" Maximum="1" Value="0.5"                      ValueChanged="sliderVolume_ValueChanged"></Slider>              <!--平衡调节按钮-->              <TextBlock Grid.Row="1" Margin="5" Text="Balance: "></TextBlock>              <Slider x:Name="sliderBalance" Grid.Row="1" Grid.Column="1" Minimum="-1" Maximum="1"                      ValueChanged="sliderBalance_ValueChanged"></Slider>              <!--播放进度调节按钮-->              <TextBlock Grid.Row="2" Margin="5" Text="Seek To: "></TextBlock>              <Slider x:Name="sliderPosition" Minimum="0" Grid.Column="1" Grid.Row="2"                      ValueChanged="sliderPosition_ValueChanged"></Slider>              <!--播放进度条-->              <Slider x:Name="sliderPositionBackground" Minimum="0" Grid.Column="1" Grid.Row="2"                       IsHitTestVisible="False" Opacity="0.5">              </Slider>          </Grid>            <!--循环播放选项-->          <CheckBox x:Name="chkLoop" Grid.Row="2" Margin="5,5,5,5" Content="Loop"></CheckBox>          <!--静音选项-->          <CheckBox x:Name="chkMute" Grid.Row="3" Margin="5,0" Content="Mute" Click="chkMute_Click"></CheckBox>          <!--播放状态提示-->          <TextBlock x:Name="lblStatus" Grid.Row="4" Margin="10" HorizontalAlignment="Center"></TextBlock>      </Grid>  </UserControl>

C# Code:

using System;  using System.Collections.Generic;  using System.Windows;  using System.Windows.Controls;  using System.Windows.Media;  using System.Windows.Media.Animation;  using System.Windows.Threading;    namespace MusicPlayer  {      public partial class Page : UserControl      {          public Page()          {              InitializeComponent();              //设置计时器精确度              timer.Interval = TimeSpan.FromSeconds(0.1);              //装载计时器              timer.Tick += timer_Tick;          }            //停止播放          public void mediaStop()          {              //将进度调节按钮与进度条归零              sliderPosition.Value = 0;              sliderPositionBackground.Value = 0;              //停止播放              media.Stop();              timer.Stop();          }            private void timer_Tick(object sender, EventArgs e)          {              lblStatus.Text = media.Position.ToString().TrimEnd(new char[] { '0' });              //使播放进度条跟随播放时间移动              sliderPositionBackground.Value = media.Position.TotalSeconds;          }            //计时器          private DispatcherTimer timer = new DispatcherTimer();            //播放键          private void cmdPlay_Click(object sender, RoutedEventArgs e)          {              //判断播放器是否处于暂停状态              if (sliderPositionBackground.Value != 0)              {                  //处于暂停状态则继续播放                  media.Position = TimeSpan.FromSeconds(sliderPositionBackground.Value);                  media.Play();                  timer.Start();              }              else              {                  //处于停止状态则开始播放                  media.Stop();                  media.Play();                  timer.Start();              }          }            //暂停键          private void cmdPause_Click(object sender, RoutedEventArgs e)          {              media.Pause();              timer.Stop();          }            //停止键          private void cmdStop_Click(object sender, RoutedEventArgs e)          {              mediaStop();          }                    //播放器打开          private void media_MediaOpened(object sender, RoutedEventArgs e)          {              media.Stop();              //将播放进度调节按钮和播放进度条的长度设为音频时长              sliderPosition.Maximum = media.NaturalDuration.TimeSpan.TotalSeconds;              sliderPositionBackground.Maximum = media.NaturalDuration.TimeSpan.TotalSeconds;          }            //播放进度调节按钮          private void sliderPosition_ValueChanged(object sender, RoutedEventArgs e)          {              //使进度条跟随调节按钮移动              sliderPositionBackground.Value = sliderPosition.Value;              //从调节位置播放              media.Stop();              media.Position = TimeSpan.FromSeconds(sliderPosition.Value);              media.Play();              timer.Start();          }            //音量调节按钮          private void sliderVolume_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)          {              if (media != null) media.Volume = sliderVolume.Value;          }            //平衡调节按钮          private void sliderBalance_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)          {              media.Balance = sliderBalance.Value;          }            //静音选项          private void chkMute_Click(object sender, RoutedEventArgs e)          {              media.IsMuted = (bool)chkMute.IsChecked;          }            //获取错误提示          private void media_MediaFailed(object sender, ExceptionRoutedEventArgs e)          {              lblStatus.Text = e.ErrorException.Message;          }            //播放结束          private void media_MediaEnded(object sender, RoutedEventArgs e)          {              //判断是否需要循环播放              if ((bool)chkLoop.IsChecked)              {                  //循环播放                  media.Position = TimeSpan.Zero;                  media.Play();              }              else              {                  //停止播放                  mediaStop();              }          }            //获取播放状态          private void media_CurrentStateChanged(object sender, RoutedEventArgs e)          {              //在Textblock中显示播放状态              lblStatus.Text = media.CurrentState.ToString();          }      }  }

::源代码下载::

你可能感兴趣的:(Silverlight2 边学边练 之四 音频播放器)