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(); // 如果当前正在播放,打开计时器
}