WPF+LibVLC开发播放器-进度条显示和拖动控制

进度条显示和拖动控制

视频教程

WPF+LibVLC开发播放器-进度条控制

界面上

界面上线增加一个Slider控件,当做播放进度条

xml 复制代码
   <Slider
       Name="PlaySlider"
       Grid.Row="1"
       Width="800"
       Margin="0,9,0,0"
       HorizontalAlignment="Center"
       VerticalAlignment="Top"
 />

代码实现

进度条显示进度

在player上的TimeChanged中实现实时更新进度条,在Player_TimeChanged里增加变化,修改Maximum值为Length值,修改Slider的Value为当前的Time值

csharp 复制代码
//更新进度条
PlaySlider.Maximum = _player.Length;
PlaySlider.Value = _player.Time;

完整代码:

csharp 复制代码
  public MainWindow()
  {
      InitializeComponent();
      Core.Initialize();
      _libVLC = new LibVLC();
      _player = new MediaPlayer(_libVLC);
      
      _player.TimeChanged += Player_TimeChanged;
      
      videoView.MediaPlayer = _player;

  }
  
private void Player_TimeChanged(object? sender, MediaPlayerTimeChangedEventArgs e)
{
  Dispatcher.Invoke(
      new Action(() =>
      {

        //更新进度条
        PlaySlider.Maximum = _player.Length;
        PlaySlider.Value = _player.Time;
        TimeText.Text =
            TimeSpan.FromMilliseconds(_player.Time).ToString(@"hh\:mm\:ss")
            + "/"
            + TimeSpan.FromMilliseconds(_player.Length).ToString(@"hh\:mm\:ss"); //总长
          
      })
  );
}

进度条拖动视频进度

接着开发拖动进度条实现更新视频进度的功能

在这里不能使用Slider的ValueChanged事件,因为在播放时间更新的时候一直在更新Value值,再拖动就会变成一直闪烁

这里需要用到三个Thumb的事件

  • DragStarted:拖动开始
  • DragDelta:拖动过程中一直触发
  • DragCompleted:拖动结束时触发

在控件上增加这三个方法

xml 复制代码
      <Slider
          Name="PlaySlider"
          Grid.Row="1" 
          Width="800"
          Margin="0,9,0,0"
          HorizontalAlignment="Center"
          VerticalAlignment="Top"
          IsMoveToPointEnabled="True"
          Thumb.DragCompleted="PlaySlider_DragCompleted"
          Thumb.DragDelta="PlaySlider_DragDelta"
          Thumb.DragStarted="PlaySlider_DragStarted" />

这里我们增加一个属性来标记拖动的开始和结束

csharp 复制代码
bool _isDrag = false;

然后修改时间变化事件,增加判断,让拖动开始时,不再更新,防止拖动异常

csharp 复制代码
private void Player_TimeChanged(object? sender, MediaPlayerTimeChangedEventArgs e)
{
    Dispatcher.Invoke(
        new Action(() =>
        {
            if (!_isDrag)
            {
                //更新内容
                PlaySlider.Maximum = _player.Length;
                PlaySlider.Value = _player.Time;
                TimeText.Text =
                    TimeSpan.FromMilliseconds(_player.Time).ToString(@"hh\:mm\:ss")
                    + "/"
                    + TimeSpan.FromMilliseconds(_player.Length).ToString(@"hh\:mm\:ss"); //总长
            }
        })
    );
}

然后实现拖动的三个方法,

PlaySlider_DragStarted:拖动开始,设置拖动标识为true,然后暂停播放

PlaySlider_DragDelta:拖动过程中,实时更新播放器的进度

PlaySlider_DragCompleted:拖动结束,标识改为false,然后继续播放

csharp 复制代码
private void PlaySlider_DragStarted(
    object sender,
    System.Windows.Controls.Primitives.DragStartedEventArgs e
)
{
    _isDrag = true;
    _player.SetPause(true);
}

private void PlaySlider_DragDelta(
    object sender,
    System.Windows.Controls.Primitives.DragDeltaEventArgs e
)
{
    _player.Time = Convert.ToInt64(PlaySlider.Value);
}

private void PlaySlider_DragCompleted(
    object sender,
    System.Windows.Controls.Primitives.DragCompletedEventArgs e
)
{
    _isDrag = false;
    _player.Play();
}

效果

实现进度条跟随播放,拖动更新进度

相关推荐
怪我冷i7 分钟前
Rust 的impl语法详解
开发语言·后端·rust
wuminyu29 分钟前
Java字节码学习总结:字节码如何加载、解析和执行
java·linux·c语言·jvm·c++
qq_4069810336 分钟前
c++的decltype是什么
开发语言·c++
坤坤子吖42 分钟前
算法学习——单调队列
开发语言·c++·笔记·学习·算法
Flynn Liang1 小时前
大模型怎么自己调函数?Spring AI 2.0 Tool Calling 自动循环原理 + 完整时序图
java·人工智能·spring·agent·函数调用·springai·toolcalling
我就是全世界1 小时前
OpenCode Go 套餐划算吗:先看你用哪个模型
开发语言·后端·golang
螺丝钉tina1 小时前
[Playwright] [02]常用命令与调试:Debug UI、Mode和 Trace Viewer
开发语言·javascript·测试工具·ui·自动化
杜 硕1 小时前
从零开始的C++生活——第六讲——01
开发语言·c++·生活
淡漠的蓝精灵2 小时前
web.py:一个简单到极致的 Python Web 框架
开发语言·前端·python·其他
乌暮2 小时前
请求进门先安检:Spring 拦截器与统一功能实战指南
java·开发语言·后端·学习·spring