将ProgressBar绑定到MediaElement值问题

时间:2014-09-15 19:25:55

标签: c# wpf progress-bar .net-4.5 mediaelement

我正在创建一个播放视频MediaElement的WPF应用程序。我不喜欢Slider控件的样子。因此,我尝试了,主要是成功使用ProgressBar代替它。

我已实现点击ProgressBar的功能,以设置自身和MediaElement位置的值。然而,当我还实现了DispatcherTimer来增加ProgressBar的值以及此功能时,我变得奇怪,我无法解决它来自哪里。

基本上当我点击ProgressBar时,填充正确地更新到光标所在的位置(我直接在setProgressBarPosition中设置),但后来稍微向后移动(我猜,当_Tick方法调用由DispatcherTimer调用,ProgressBar.Value根据meVideo的位置设置meVideo.Position

MSPaint箭头显示我点击的位置,红色填充显示更新的位置,光标点击和填充位置之间的间隙变得越大,我点击的时间线中的更晚,这让我觉得我犯了一个错误在某个地方进行计算:

Screenshot

我想我在pgbVideo_MouseUp private void videoTimer_Tick(object sender, EventArgs e) { if (!isDragging) { pgbVideo.Value = meVideo.Position.TotalSeconds; } } /* * Handles the clicking of the video timeline. */ private void pgbVideo_MouseDown(object sender, MouseButtonEventArgs e) { double mousePosition = e.GetPosition(pgbVideo).X; setProgressBarPosition(mousePosition); isDragging = true; } /* * Handles the dragging of the mouse over the video timeline. */ private void pgbVideo_MouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { double mousePosition = e.GetPosition(pgbVideo).X; setProgressBarPosition(mousePosition); } } /* * Sets the position of the video timeline progressbar. */ private void setProgressBarPosition(double mousePosition) { if (meVideo.Source != null) { double progressBarPosition = mousePosition / pgbVideo.ActualWidth * pgbVideo.Maximum; pgbVideo.Value = progressBarPosition; } } /* * Sets the position of the media element. */ private void pgbVideo_MouseUp(object sender, MouseButtonEventArgs e) { if (meVideo.Source != null) { double videoPositon = meVideo.NaturalDuration.TimeSpan.Ticks * (pgbVideo.Value / pgbTime.Maximum); meVideo.Position = new TimeSpan((int)videoPositon); } isDragging = false; } 的设置中可能做错了但我看不到它。这是我的代码:

_MediaOpened

感谢阅读,感谢任何帮助!

编辑:这是我的ProgressBar方法,其中我设置了private void meVideo_MediaOpened(object sender, RoutedEventArgs e) { pgbVideo.Maximum = meVideo.NaturalDuration.TimeSpan.TotalSeconds; videoTimer.Start(); isPlaying = true; } 的最大值:

{{1}}

1 个答案:

答案 0 :(得分:0)

令人恼火的是,我在智能感知上过快地犯了一个简单的错误!在pgbVideo_MouseUp行:

double videoPositon = meVideo.NaturalDuration.TimeSpan.Ticks * (pgbVideo.Value / pgbTime.Maximum);

应该是:

double videoPositon = meVideo.NaturalDuration.TimeSpan.Ticks * (pgbVideo.Value / pgbVideo.Maximum);

pgbTime是指另一个不相关的ProgressBar Maximum,其中TotalSeconds为100. Maximum加载的视频用于设置pgbVideo {{1}}和视频长度为92秒,问题表现为准确性问题(至少对我来说!),而如果视频是10分钟,那么行为就会消失,也许会引导我看一个更明显的错误!

感谢所有试图提供帮助的人。