尝试绑定滑块的最大值到媒体元素的持续时间,并将滑块的当前值绑定到媒体元素的位置,但由于某些原因,它没有。
我希望滑块在视频播放时移动它的拇指。
<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}" />
答案 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类型。您正在尝试相应地绑定类型TimeSpan
和Duration
的值,这就是绑定系统在您的情况下不起作用的原因。
您可以尝试编写转换器,或绑定到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();