我正在使用MediaElement对象和SurfaceSlider对象,我使用SurfaceSlider来控制视频位置,并希望SurfaceSlider显示视频的当前位置,就像youtube一样。
我使用此代码来控制视频的位置,当SurfaceSlider对象的ValueChanged事件发生时调用此函数...
private void SeekToMediaPosition(object sender, RoutedPropertyChangedEventArgs<double> args)
{
int SliderValue = (int)mySurfaceSlider.Value;
TimeSpan ts = new TimeSpan(0, 0, 0, 0, SliderValue);
myMediaElement.Position = ts;
}
我使用此代码显示视频的当前位置......
DispatcherTimer ticks = new DispatcherTimer();
private void Element_MediaOpened(object sender, EventArgs e)
{
mySurfaceSlider.Maximum = myMediaElement.NaturalDuration.TimeSpan.TotalMilliseconds;
ticks.Interval = TimeSpan.FromMilliseconds(1);
ticks.Tick += ticks_Tick;
ticks.Start();
myMediaElement.Play();
}
void ticks_Tick(object sender, object e)
{
mySurfaceSlider.Value = myMediaElement.Position.TotalMilliseconds;
}
问题是当SurfaceSlider值改变,显示视频的当前位置时,也会调用ValueChanged事件,并且视频的位置也会改变,我猜想会创建一个循环。
当用户更改SurfaceSlider值或处理此问题的方法时,是否还有其他事件要使用?
由于
答案 0 :(得分:0)
埃斯特,
我认为我会尝试一些事情。
1 ...将TimeSpan.FromMilliseconds(1)增加到TimeSpan.FromMilliseconds(100)或更高版本。我不认为您的滑块需要连续轮询您的视频。
2 ...我认为你可以在设置myMediaElement.Position之前在SeekToMediaPosition(SeekInProgress = true)中设置一个标志。然后在ticks_Tick中,如果SeekInProgress == true,则设置SeekInProgress = false并且不要将mySurfaceSlider.Value设置为一个定时器周期。
我相信您使用的代码的原始版本来自此处:http://msdn.microsoft.com/en-us/library/ms748248.aspx ...也许代码正在做些什么来防止您的实施中遗漏的问题?
如果滑块跳转,可能在用户将手指放在滑块上和移动滑块之间存在滞后(导致SeekToMediaPosition触发)。你需要做的是检测是否用户当前在ticks_Tick触摸mySurfaceSlider(也许有触摸点的集合,查询与mySurfaceSlider交集?抑或mySurfaceSlider已经着陆和触上事件?)在任何情况下,如果用户是甚至TOUCHING mySurfaceSlider,你不应该让ticks_Tick更新mySurfaceSlider.Value(或者在几毫秒之后)。