У меня есть ползунок прогресса видео в XAML, таким образом:
<Slider Minimum="0" Value="{Binding Position,Mode=OneWay}" Maximum="{Binding Duration}" IsMoveToPointEnabled="True"/>
И код в моей модели просмотра для обновления Position on Clock.CurrentTimeInvalidated (), который позволяет ползунку отслеживать текущий прогресс:
private void Play()
{
Uri next = _carousel.Dequeue();
_timeline = new MediaTimeline(next);
_timeline.RepeatBehavior = RepeatBehavior.Forever;
_clock = _timeline.CreateClock();
MyMediaElement.Clock = _clock;
_clock.CurrentTimeInvalidated += new EventHandler(UpdatePosition);
_clock.Controller.Begin();
}
public void UpdatePosition(object sender, EventArgs e)
{
Position = MyMediaElement.Position.TotalMilliseconds;
}
Это работает нормально, за исключением случаев, когда я реализую ValueChanged для установки Clock.Controller.Seek ():
private void seekSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
DisplayViewModel vm = (DisplayViewModel)this.DataContext;
TimeSpan ts = new TimeSpan(0, 0, 0, 0, (int)seekSlider.Value);
vm.MyMediaElement.Clock.Controller.Seek(ts, TimeSeekOrigin.BeginTime);
}
(В коде моего пользовательского элемента управления, пока я не выясню маршрутизацию от события к команде)
В этот момент я получаю бесконечный цикл.Ранее в не-MVVM я просто отключал обработчик событий Slider.ValueChanged () во время UpdatePosition:
public void UpdatePosition(object sender, EventArgs e)
{
seekSlider.ValueChanged -= new EventHandler(seekSlider_ValueChanged);
Position = MyMediaElement.Position.TotalMilliseconds;
seekSlider.ValueChanged += new EventHandler(seekSlider_ValueChanged);
}
... но теперь я нахожусь в модели представления, у меня больше нет доступа к элементу управления ползунком.
Есть ли другой способ отключить бесконечный цикл / обработчик событий?