我正在创建一个播放视频MediaElement
的WPF应用程序。我不喜欢Slider
控件的样子。因此,我尝试了,主要是成功使用ProgressBar
代替它。
我已实现点击ProgressBar
的功能,以设置自身和MediaElement
位置的值。然而,当我还实现了DispatcherTimer
来增加ProgressBar
的值以及此功能时,我变得奇怪,我无法解决它来自哪里。
基本上当我点击ProgressBar
时,填充正确地更新到光标所在的位置(我直接在setProgressBarPosition
中设置),但后来稍微向后移动(我猜,当_Tick
方法调用由DispatcherTimer
调用,ProgressBar.Value
根据meVideo
的位置设置meVideo.Position
。
MSPaint箭头显示我点击的位置,红色填充显示更新的位置,光标点击和填充位置之间的间隙变得越大,我点击的时间线中的更晚,这让我觉得我犯了一个错误在某个地方进行计算:
我想我在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}}
答案 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分钟,那么行为就会消失,也许会引导我看一个更明显的错误!
感谢所有试图提供帮助的人。