4

尝试将滑块的最大值绑定到媒体元素的持续时间并将滑块的当前值绑定到媒体元素的位置,但由于某些原因它没有。

我希望滑块在视频播放时移动它的拇指。

<Slider x:Name="videoSlider" Value="{Binding ElementName=mp3MediaElement, Path=Position}" 
ValueChanged="videoSlider_ValueChanged" IsMoveToPointEnabled="True" 
Maximum="{Binding ElementName=mp3MediaElement, Path=NaturalDuration}" 
AllowDrop="True" DataContext="{Binding ElementName=mp3MediaElement}" />
4

4 回答 4

10

我没有使用绑定..我有一个类似的问题并为此使用了计时器(我的代码在 Silverlight 中,假设在 WPF 上是相同的):

第一个方向(电影更新滑块)

private TimeSpan TotalTime;

private void MyMediaElement_MediaOpened(object sender, RoutedEventArgs e)
        {
            TotalTime = MyMediaElement.NaturalDuration.TimeSpan;

            // Create a timer that will update the counters and the time slider
            timerVideoTime = new DispatcherTimer();
            timerVideoTime.Interval = TimeSpan.FromSeconds(1);
            timerVideoTime.Tick += new EventHandler(timer_Tick);
            timerVideoTime.Start();
        }

void timer_Tick(object sender, EventArgs e)
        {
            // Check if the movie finished calculate it's total time
            if (MyMediaElement.NaturalDuration.TimeSpan.TotalSeconds > 0)
            {
                if (TotalTime.TotalSeconds > 0)
                {
                    // Updating time slider
                    timeSlider.Value = MyMediaElement.Position.TotalSeconds /
                                       TotalTime.TotalSeconds;
                }
            }
        }

表单 ctor 或类似内容的第二个方向(用户更新滑块)
写下以下行:

timeSlider.AddHandler(MouseLeftButtonUpEvent, 
                      new MouseButtonEventHandler(timeSlider_MouseLeftButtonUp), 
                      true);

事件处理程序是:

private void timeSlider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (TotalTime.TotalSeconds > 0)
            {
                MyMediaElement.Position = TimeSpan.FromSeconds(timeSlider.Value * TotalTime.TotalSeconds);
            }
        }
于 2012-04-18T12:12:11.737 回答
3

Slider 属性 Value 和 Maximum 都是 Double 类型。您正在尝试绑定到类型的值TimeSpanDuration相应地绑定,这就是绑定系统在您的情况下不起作用的原因。

您可以尝试编写转换器,或绑定到NaturalDuration.TimeSpan.TotalSeconds属性。

希望这可以帮助。

顺便说一句,如果您的某些绑定不起作用,您可以在 Visual Studio“输出”窗口中检查绑定错误。

于 2012-04-18T12:21:26.397 回答
0

我遇到了同样的问题,滑块没有更新 MediaElement 的 UI。
我花了很长时间试图修复它,但我不确定它是否会帮助其他人。
但是以防万一其他人遇到这个问题,请注意媒体元素中有一个ScrubbingEnabled属性,它允许 MediaElement 的 UI 根据位置自动寻找正确的图片。
当您处于暂停模式并尝试拖动滑块时非常有用。
只需ScrubbingEnabled="True"在您的 MediaElement 的 XAML 中添加:

于 2016-12-20T06:17:20.073 回答
0

这是我最终用于我的 UWP 应用程序的内容。

这个答案只是解决了具体问题;移动滑块以响应播放。它不处理响应用户移动滑块而改变视频位置。

首先添加这些:

private DispatcherTimer timerVideoPlayback;

private void TimerVideoPlayback_Tick(object sender, object e)
{
    long currentMediaTicks = mediaElement.Position.Ticks;
    long totalMediaTicks = mediaElement.NaturalDuration.TimeSpan.Ticks;

    if (totalMediaTicks > 0)
        slider.Value = (double)currentMediaTicks / totalMediaTicks * 100;
    else
        slider.Value = 0;
}

然后当您的视频开始播放时,启动计时器:

timerVideoPlayback = new DispatcherTimer();
timerVideoPlayback.Interval = TimeSpan.FromMilliseconds(10);
timerVideoPlayback.Tick += TimerVideoPlayback_Tick;
timerVideoPlayback.Start();

我使用了 10 毫秒的间隔来保持滑块运动稳定。使用您喜欢的任何值。

并且不要忘记在播放结束时停止该计时器:

timerVideoPlayback.Stop();
于 2018-03-12T02:26:31.280 回答