将MediaElement绑定到WPF中的滑块位置

时间:2012-04-18 12:02:23

标签: wpf slider mediaelement

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

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

<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 个答案:

答案 0 :(得分: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);
            }
        }

答案 1 :(得分:3)

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

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

希望这有帮助。

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

答案 2 :(得分:0)

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

答案 3 :(得分: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 ms的间隔来保持滑块运动稳定。使用您喜欢的任何值。

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

timerVideoPlayback.Stop();