如何在不调用ValueChanged事件的情况下更改SurfaceSlider的值?

时间:2013-09-19 21:49:32

标签: slider

我正在使用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值或处理此问题的方法时,是否还有其他事件要使用?

由于

1 个答案:

答案 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(或者在几毫秒之后)。