我在XAML中有一个视频进度滑块:
<Slider Minimum="0" Value="{Binding Position,Mode=OneWay}" Maximum="{Binding Duration}" IsMoveToPointEnabled="True"/>
我的viewmodel中的代码更新了Clock.CurrentTimeInvalidated()上的Position,它使滑块跟踪当前的进度:
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中我只是在UpdatePosition期间禁用了Slider.ValueChanged()事件处理程序:
public void UpdatePosition(object sender, EventArgs e)
{
seekSlider.ValueChanged -= new EventHandler(seekSlider_ValueChanged);
Position = MyMediaElement.Position.TotalMilliseconds;
seekSlider.ValueChanged += new EventHandler(seekSlider_ValueChanged);
}
...但现在我在一个视图模型中,我无法再访问我的滑块控件。
是否有其他方法可以禁用无限循环/事件处理程序?
答案 0 :(得分:0)
考虑将逻辑从seekSlider_ValueChanged
移至ViewModel
中的位置属性的设置者。