WPF Slider 音乐进度条功能实现

1.Slider控件创建

最好在XAML中创建,方便设置宽高样式,位置。

<Slider x:Name="Slider_ListPlayer_Timer" 
	Margin="42,0,46,1" VerticalAlignment="Bottom"
	Style="{DynamicResource SliderStyle1}" 
	LargeChange="0" IsMoveToPointEnabled="True"
	ValueChanged="Slider_ListPlayer_Timer_ValueChanged"
	Thumb.DragStarted="Slider_ListPlayer_Timer_DragStarted"
	Thumb.DragCompleted="Slider_ListPlayer_Timer_DragCompleted" 
></Slider>

在这里插入图片描述

2.属性说明

属性说明
Margin布局、四周边距
VerticalAlignment纵向布局、顶部/底部
Style样式(上例为事先写好的样式表,在这里直接使用)
LargeChange左边右边点击的改变值,默认为1
IsMoveToPointEnabled是否支持点击Slider后Thumb直接到对应位置
Maximum进度条最大值:double类型(例如:音乐秒数)
Minimum进度条最小值:double类型(一般为0)
Orientation进度条是横向布局或纵向布局(默认为横向)
ValueChanged当进度条的值(小白点)改变时触发的事件
Thumb.DragStarted小白点开始拖拽时触发的事件
Thumb.DragCompleted小白点结束拖拽时触发的事件

3.Slider与MediaElement结合播放音乐的示例

0 说明

一般音乐播放器的进度条会实现:
(1)实时更新音乐进度、配合文字控件,显示当前时间、音乐总时长
(2)点击进度条任意位置、跳转到对应位置播放音乐
(3)拖拽进度条小白点、跳转到对应位置播放音乐、中途一般不能停止播放
(4)播放完毕自动下一曲或循环播放:这个一般是播放控件的任务

1 当播放音乐时,重新设置Slider的最大值和当前值,设置音乐总时长文字

MediaElement 组件声明简略版,详细版见WPF专栏,MediaElement 帖子

<MediaElement Name = "My_MediaPlayer" />
// 获取音频总长度
TimeSpan duration = My_MediaPlayer.NaturalDuration.HasTimeSpan ?
	My_MediaPlayer.NaturalDuration.TimeSpan : TimeSpan.FromMilliseconds(0);
Slider_ListPlayer.Maximum = duration.TotalSeconds;
Slider_ListPlayer.value = 0;
// 设置当前音频当前进度-音乐长度 文本
Text_ListPlayer_AllTimerOFSong.Text = 
	(duration.Minutes + duration.Hours * 60).ToString()+ ":" + duration.Seconds;
2 使用定时器每秒更新进度条

每秒更新进度和文字的计时器,在Play()时开始,在Pause() / Stop() / 拖拽小白点时停止

private void Timer_Tick(object sender, EventArgs e)
{
	// 获取当前音频播放进度
	string b = My_MediaPlayer.Position.ToString().Substring(0, 8);
	string[] videotime = b.Split(':');
	int totime = int.Parse(videotime[0]) * 3600 + 
		int.Parse(videotime[1]) * 60 + 	int.Parse(videotime[2]);
	int nMinutes = int.Parse(videotime[0]) * 60 + int.Parse(videotime[1]);
	// 刷新文本
	Text_ListPlayer_NowTimerOFSong.Text = nMinutes.ToString() + ":" + videotime[2];
	// 更新进度条
	Slider_ListPlayer.Value = My_MediaPlayer.Position.TotalSeconds;
}
3 Slider 值改变事件、小白点拖拽开始和结束事件

使用到的bool值
b_IsPlaying : 当前是否正在播放音乐
b_IsDrag_PlayerSlider : 当前是否正在拖拽小白点

// 进度条Value发生改变后 / 进度条拖动开始与结束事件
private void Slider_ListPlayer_Timer_ValueChanged(object sender, 
	RoutedPropertyChangedEventArgs<double> e)
{
	if (My_MediaPlayer.Source == null) return;
	// 当进度条正在被拖拽时
	if (b_IsDrag_PlayerSlider)
	{
		// 更新左边Text的文本
        int nValue = (int)Slider_ListPlayer_Timer.Value;
        TextB_ListPlayer_NowTimerOFSong.Text = (nValue / 60).ToString() + ":" 
        + (nValue % 60).ToString();
	}
    else // 当通过点击更改滑块位置时
    {
         // 如果更改的不足10秒,就不动
         if (Math.Abs(My_MediaPlayer.Position.TotalSeconds 
         	- Slider_ListPlayer.Value) < 10)
             return;
             // 更新音频播放进度
         My_MediaPlayer.Position = 
             TimeSpan.FromSeconds(Slider_ListPlayer_Timer.Value);
    }
}

private void Slider_ListPlayer_Timer_DragStarted(object sender, DragStartedEventArgs e)
{
	if (My_MediaPlayer.Source == null) return; // 如果当前播放器没有资源就直接返回
    b_IsDrag_PlayerSlider = true; 
    timer.Stop(); // 关闭定时器,不然每一秒都会刷新位置与拖动冲突
}

private void Slider_ListPlayer_Timer_DragCompleted(object sender, DragCompletedEventArgs e)
{
	if (My_MediaPlayer.Source == null) return;
    b_IsDrag_PlayerSlider = false;
    
    My_MediaPlayer.Position = TimeSpan.FromSeconds(Slider_ListPlayer_Timer.Value);
    if (b_IsPlaying) timer.Start(); // 如果当前正在播放,打开计时器
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值