WPF中可以使用MediaElement控件来进行音视频播放,然后需要做个进度条啥的,但是MediaElement.Position(进度)和MediaElement.NaturalDuration居然都不是依赖属性,简直不能忍!
好吧,首先说说比较传统的做法(winform?)
slider用来显示进度以及调整进度,tb1显示当前进度的时间值,tb2显示视频的时长。
player_Loaded 事件中使用DispatcherTimer来定时获取当前视频的播放进度,
player_MediaOpened 事件中获取当前视频的时长(只有在视频加载完成后才可以获取到)
slider_ValueChanged 事件中执行对视频进度的调整
xaml: <MediaElement Name="player" Source="e:\MVVMLight (1).wmv" Loaded="player_Loaded" MediaOpened="player_MediaOpened"/> <Slider Grid.Row="1" Margin="10" Name="slider" ValueChanged="slider_ValueChanged"/> <WrapPanel Grid.Row="1" Margin="0,40,0,0"> <TextBlock Name="tb1" Width="120"/> <TextBlock Name="tb2" Width="120"/> </WrapPanel> 后台代码: private void player_Loaded(object sender, RoutedEventArgs e) { DispatcherTimer timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromMilliseconds(1000); timer.Tick += (ss, ee) => { //显示当前视频进度 var ts = player.Position; tb1.Text = string.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);slider.Value = ts.TotalMilliseconds; }; timer.Start(); } private void player_MediaOpened(object sender, RoutedEventArgs e) { //显示视频的时长 var ts = player.NaturalDuration.TimeSpan; tb2.Text = string.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds); slider.Maximum = ts.TotalMilliseconds; } private void slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { //调整视频进度 var ts = TimeSpan.FromMilliseconds(e.NewValue); player.Position = ts; }