运行环境:blend 4.0或者visual studio 2010(silverlgiht开发环境需要安装好)

本例实现了mp3的一些基本功能:如播放、暂停、停止、循环播放、静音、调节音量等!

下面是所作播放器的效果图:

布局方面于我一个菜鸟来说,由于经验尚浅,而且我也不是所谓的美工人员,所以会存在很多不足,我也会努力在以后慢慢纠正,如果有什么好的布局方案,请告诉我好好学习学习!下面是我的布局图:

其中相应的xaml代码如下所示:

<UserControl
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing" mc:Ignorable="d"
	x:Class="mp3PlayerDemo.MainPage"
	Width="640" Height="480">
	<UserControl.Resources>
		<SolidColorBrush x:Key="Brush1" Color="#FF144B95"/>
		<LinearGradientBrush x:Key="Brush3" EndPoint="0.5,1" StartPoint="0.5,0">
			<GradientStop Color="#FF80FCFF" Offset="0"/>
			<GradientStop Color="#FF15C0C4" Offset="1"/>
		</LinearGradientBrush>
		<LinearGradientBrush x:Key="Brush4" EndPoint="0.5,1" StartPoint="0.5,0">
			<GradientStop Color="#FF1E899D" Offset="0"/>
			<GradientStop Color="#FF29D9FB" Offset="1"/>
		</LinearGradientBrush>
		<SolidColorBrush x:Key="Brush2" Color="#FFC4FFFB"/>
		<Style x:Key="ButtonStyle1" TargetType="Button">
			<Setter Property="Template">
				<Setter.Value>
					<ControlTemplate TargetType="Button">
						<Grid x:Name="grid" Margin="0,0,0,3" RenderTransformOrigin="0.5,0.5">
							<Grid.RenderTransform>
								<CompositeTransform/>
							</Grid.RenderTransform>
							<Grid.Effect>
								<DropShadowEffect Color="#FF16D6D1" ShadowDepth="0"/>
							</Grid.Effect>
							<VisualStateManager.VisualStateGroups>
								<VisualStateGroup x:Name="CommonStates">
									<VisualState x:Name="Normal"/>
									<VisualState x:Name="MouseOver">
										<Storyboard>
											<DoubleAnimation Duration="0" To="1.431" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" Storyboard.TargetName="grid" d:IsOptimized="True"/>
											<DoubleAnimation Duration="0" To="3.667" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="grid" d:IsOptimized="True"/>
											<DoubleAnimation Duration="0" To="1.3" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="grid" d:IsOptimized="True"/>
											<DoubleAnimation Duration="0" To="3" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="grid" d:IsOptimized="True"/>
											<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Cursor)" Storyboard.TargetName="grid">
												<DiscreteObjectKeyFrame KeyTime="0">
													<DiscreteObjectKeyFrame.Value>
														<Cursor>Hand</Cursor>
													</DiscreteObjectKeyFrame.Value>
												</DiscreteObjectKeyFrame>
											</ObjectAnimationUsingKeyFrames>
										</Storyboard>
									</VisualState>
									<VisualState x:Name="Pressed"/>
									<VisualState x:Name="Disabled"/>
								</VisualStateGroup>
							</VisualStateManager.VisualStateGroups>
							<Rectangle Stroke="{StaticResource Brush3}" StrokeThickness="3" Fill="{StaticResource Brush4}"/>
							<ed:RegularPolygon InnerRadius="1" PointCount="3" Stretch="Fill" StrokeThickness="2" UseLayoutRounding="False" Margin="6.583,3.332,4.918,3.584" RenderTransformOrigin="0.5,0.5" Stroke="{StaticResource Brush1}" Fill="{StaticResource Brush1}">
								<ed:RegularPolygon.RenderTransform>
									<CompositeTransform Rotation="90"/>
								</ed:RegularPolygon.RenderTransform>
							</ed:RegularPolygon>
							<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="" ToolTipService.ToolTip="播放" Cursor="Arrow"/>
						</Grid>
					</ControlTemplate>
				</Setter.Value>
			</Setter>
		</Style>
		<Color x:Key="Color1">#FF16D6D1</Color>
		<Style x:Key="ButtonStyle2" TargetType="Button">
			<Setter Property="Template">
				<Setter.Value>
					<ControlTemplate TargetType="Button">
						<Grid x:Name="grid" Margin="0,0,0,3" RenderTransformOrigin="0.5,0.5">
							<Grid.RenderTransform>
								<CompositeTransform/>
							</Grid.RenderTransform>
							<Grid.Effect>
								<DropShadowEffect Color="{StaticResource Color1}" ShadowDepth="1"/>
							</Grid.Effect>
							<VisualStateManager.VisualStateGroups>
								<VisualStateGroup x:Name="CommonStates">
									<VisualState x:Name="Normal"/>
									<VisualState x:Name="MouseOver">
										<Storyboard>
											<DoubleAnimation Duration="0" To="1.382" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" Storyboard.TargetName="grid" d:IsOptimized="True"/>
											<DoubleAnimation Duration="0" To="3.25" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="grid" d:IsOptimized="True"/>
											<DoubleAnimation Duration="0" To="1.275" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="grid" d:IsOptimized="True"/>
											<DoubleAnimation Duration="0" To="2.75" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="grid" d:IsOptimized="True"/>
										</Storyboard>
									</VisualState>
									<VisualState x:Name="Pressed"/>
									<VisualState x:Name="Disabled"/>
								</VisualStateGroup>
							</VisualStateManager.VisualStateGroups>
							<Rectangle StrokeThickness="3" Stroke="{StaticResource Brush3}" Fill="{StaticResource Brush4}"/>
							<Rectangle HorizontalAlignment="Left" Margin="6,5,0,5" Stroke="{StaticResource Brush1}" Width="2" StrokeThickness="2" Fill="{StaticResource Brush1}"/>
							<Rectangle HorizontalAlignment="Right" Margin="0,5,5,5" Stroke="{StaticResource Brush1}" Width="2" StrokeThickness="2" Fill="{StaticResource Brush1}"/>
							<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content=""/>
						</Grid>
					</ControlTemplate>
				</Setter.Value>
			</Setter>
		</Style>
		<Style x:Key="ButtonStyle3" TargetType="Button">
			<Setter Property="Template">
				<Setter.Value>
					<ControlTemplate TargetType="Button">
						<Grid x:Name="grid" Margin="0,-2,-3,-1" d:LayoutOverrides="VerticalAlignment" RenderTransformOrigin="0.5,0.5">
							<Grid.RenderTransform>
								<CompositeTransform/>
							</Grid.RenderTransform>
							<Grid.Effect>
								<DropShadowEffect Color="{StaticResource Color1}" ShadowDepth="0"/>
							</Grid.Effect>
							<VisualStateManager.VisualStateGroups>
								<VisualStateGroup x:Name="CommonStates">
									<VisualState x:Name="Normal"/>
									<VisualState x:Name="MouseOver">
										<Storyboard>
											<DoubleAnimation Duration="0" To="1.433" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" Storyboard.TargetName="grid" d:IsOptimized="True"/>
											<DoubleAnimation Duration="0" To="3.25" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="grid" d:IsOptimized="True"/>
											<DoubleAnimation Duration="0" To="1.5" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="grid" d:IsOptimized="True"/>
											<DoubleAnimation Duration="0" To="1.25" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="grid" d:IsOptimized="True"/>
											<DoubleAnimation Duration="0" To="1.628" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" Storyboard.TargetName="rectangle" d:IsOptimized="True"/>
											<DoubleAnimation Duration="0" To="0.174" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="rectangle" d:IsOptimized="True"/>
											<DoubleAnimation Duration="0" To="1.333" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" Storyboard.TargetName="rectangle" d:IsOptimized="True"/>
											<DoubleAnimation Duration="0" To="-0.5" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" Storyboard.TargetName="rectangle" d:IsOptimized="True"/>
										</Storyboard>
									</VisualState>
									<VisualState x:Name="Pressed"/>
									<VisualState x:Name="Disabled"/>
								</VisualStateGroup>
							</VisualStateManager.VisualStateGroups>
							<Ellipse StrokeThickness="2" Fill="{StaticResource Brush4}">
								<Ellipse.Stroke>
									<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
										<GradientStop Color="#FF23E0D3" Offset="0"/>
										<GradientStop Color="#FF99FFF8" Offset="1"/>
									</LinearGradientBrush>
								</Ellipse.Stroke>
							</Ellipse>
							<Rectangle x:Name="rectangle" Margin="5,4" Stroke="{StaticResource Brush1}" StrokeThickness="2" Fill="{StaticResource Brush1}" RenderTransformOrigin="0.5,0.5">
								<Rectangle.Effect>
									<DropShadowEffect Color="#FFE7A022" ShadowDepth="0"/>
								</Rectangle.Effect>
								<Rectangle.RenderTransform>
									<CompositeTransform/>
								</Rectangle.RenderTransform>
							</Rectangle>
							<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content=""/>
						</Grid>
					</ControlTemplate>
				</Setter.Value>
			</Setter>
		</Style>
	</UserControl.Resources>

	<Grid x:Name="LayoutRoot">
		<Grid.Background>
			<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
				<GradientStop Color="#FF135A91" Offset="0"/>
				<GradientStop Color="#FF1CBBE4" Offset="1"/>
			</LinearGradientBrush>
		</Grid.Background>
		<Border BorderThickness="2.5" Margin="227,128,139,220" CornerRadius="10" BorderBrush="#FF5EB9FF">
			<Border.Effect>
				<DropShadowEffect Color="#FF63A2E7"/>
			</Border.Effect>
			<Border.Background>
				<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
					<GradientStop Color="#FF93D4FD" Offset="0"/>
					<GradientStop Color="#FF109BF3" Offset="1"/>
				</LinearGradientBrush>
			</Border.Background>
			<Grid>
				<Grid.RowDefinitions>
					<RowDefinition Height="0.1*"/>
					<RowDefinition Height="0.567*"/>
					<RowDefinition Height="0.093*"/>
					<RowDefinition Height="0.241*"/>
				</Grid.RowDefinitions>
				<Grid.ColumnDefinitions>
					<ColumnDefinition Width="0.044*"/>
					<ColumnDefinition Width="0.649*"/>
					<ColumnDefinition Width="0.307*"/>
				</Grid.ColumnDefinitions>
				<Border BorderThickness="1" Margin="0,-1,0,0" Grid.Column="1" Grid.Row="1" Background="#FF109BF3" CornerRadius="10">
					<Border.Effect>
						<DropShadowEffect Color="#FF4BF3C9" ShadowDepth="0"/>
					</Border.Effect>
					<Grid>
						<TextBlock x:Name="lblStatus" TextWrapping="Wrap" Text="00:00:00" HorizontalAlignment="Right" Width="39" Height="10" VerticalAlignment="Bottom" Foreground="#FF3BEFE3" Margin="0,0,8,0" FontSize="8"/>
					</Grid>
				</Border>
				<Border BorderBrush="#FF1874AF" BorderThickness="1" Margin="15,0,17,8" Grid.Row="3" Grid.Column="1" CornerRadius="10">
					<Border.Effect>
						<DropShadowEffect Color="#FF64D8FF" Direction="316" ShadowDepth="1" BlurRadius="12"/>
					</Border.Effect>
					<Border.Background>
						<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
							<GradientStop Color="#FF52A4EF" Offset="0"/>
							<GradientStop Color="#FF109BF3" Offset="0.626"/>
							<GradientStop Color="#FF4091DE" Offset="0.991"/>
						</LinearGradientBrush>
					</Border.Background>
					<Grid Margin="7,0,0,0">
						<Slider x:Name="sliderPosition" ValueChanged="sliderPosition_ValueChanged" d:IsHidden="True"/>
						<Slider x:Name="sliderPositionBackground" Margin="0" d:LayoutOverrides="Width, Height" IsHitTestVisible="False"/>
					</Grid>
				</Border>
				<Grid Grid.Column="2" Margin="16,12,12,21" Grid.Row="1">
					<Button x:Name="cmdPlay" Content="Button" Margin="0,0,0,19" Style="{StaticResource ButtonStyle1}" HorizontalAlignment="Left" Width="20" Cursor="Hand" Click="cmdPlay_Click" />
					<Button x:Name="cmdPause" Content="" HorizontalAlignment="Right" Margin="0,0,0,19" Style="{StaticResource ButtonStyle2}" Width="20" ToolTipService.ToolTip="暂停" Cursor="Hand" Click="cmdPause_Click"/>
					<Button x:Name="cmdStop" Content="Button" Margin="17,27,21,0" Style="{StaticResource ButtonStyle3}" Cursor="Hand" Height="12" VerticalAlignment="Top" Click="cmdStop_Click"/>
				</Grid>
				<MediaElement x:Name="media" Grid.ColumnSpan="3" Grid.RowSpan="4" Source="/Nothing In The World.mp3" d:IsHidden="True"/>
				<StackPanel Grid.Column="1" Height="17" Margin="26,0,67,0" Orientation="Horizontal" Grid.Row="1" VerticalAlignment="Bottom">
					<CheckBox x:Name="chkLoop" Content="循环" HorizontalAlignment="Left" Margin="0" Cursor="Hand" FontSize="8" d:LayoutOverrides="Height" Width="39" Foreground="{StaticResource Brush2}"/>
					<CheckBox x:Name="chkMute" Content="无声" Cursor="Hand" Margin="6,1,0,0" FontSize="8" d:LayoutOverrides="Height" Click="chkMute_Click" Foreground="{StaticResource Brush2}"/>
				</StackPanel>
				<StackPanel Grid.Column="1" Margin="26,8,17,21" Orientation="Vertical" Grid.Row="1" d:LayoutOverrides="Height">
					<StackPanel Orientation="Horizontal">
						<TextBlock TextWrapping="Wrap" Text="Balance:" Foreground="{StaticResource Brush2}"/>
						<Slider x:Name="sliderBalance" ValueChanged="sliderBalance_ValueChanged" HorizontalContentAlignment="Left" Value="5" Width="84"/>
					</StackPanel>
					<StackPanel Orientation="Horizontal">
						<TextBlock TextWrapping="Wrap" Text="Volume:" Foreground="{StaticResource Brush2}" HorizontalAlignment="Left" Width="49"/>
						<Slider x:Name="sliderVolume" VerticalAlignment="Bottom" ValueChanged="sliderVolume_ValueChanged" HorizontalContentAlignment="Left" Value="5" Width="84"/>
					</StackPanel>
				</StackPanel>
				<TextBlock TextWrapping="Wrap" Text="Design by 小D" Grid.Column="2" HorizontalAlignment="Left" Grid.Row="3" Width="82" Margin="0,8,0,0" FontStyle="Italic" Foreground="#FF24E5E1">
					<TextBlock.Effect>
						<DropShadowEffect Color="#FF52EBDA" ShadowDepth="0"/>
					</TextBlock.Effect>
				</TextBlock>
			</Grid>
		</Border>
	</Grid>
</UserControl>

该例子的后台代码来源于:http://www.cnblogs.com/gnielee/archive/2009/07/30/silverlight2-learning-musicplayer.html

后台的.cs文件的代码如下所示:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace mp3PlayerDemo
{
public partial class MainPage : UserControl
{
public MainPage()
{
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)
{
if(media!=null)
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();
}


}
}

第一次做了个成品出来,很多东西都是借鉴与人,非常感谢园友们的分享精神,才会让我这菜鸟学到这么多可以实践的东西,我也会继续努力。如果有什么好的方法或者布局,或者对小D的一些意见,请大神们多多指点!

源代码下载:mp3Demo.rar

推荐blend高手博客:http://www.cnblogs.com/kaodigua/