0

我正在使用 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 值时,是否有任何其他事件要使用,或者有什么方法可以处理这个问题?

谢谢

4

1 回答 1

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 是否有 touchdown 和 touchup 事件?)无论如何,如果用户是即使触摸 mySurfaceSlider,也不应该让 ticks_Tick 更新 mySurfaceSlider.Value(或几毫秒后)。

于 2013-09-20T12:56:21.223 回答