将进度条绑定到wpf中的mediaelement

在c#/ wpf中,我在窗口中添加了一个进度条和媒体元素。 我们的想法是,进度条显示媒体元素的播放量。

我尝试使用以下xaml:

      

我试图将Maximum和Value属性绑定到mediaelement。 但是当我将mp3加载到mediaelement时,进度条没有任何问题。 (正在播放音乐,因此mp3已加载并正常播放)。

我更喜欢用绑定来做这件事。

我在这做错了什么?

这是因为Media未打开,因此进度条不知道最大值。 试试这个…

对MediaOpened使用以下事件,对进度条或滑块使用MouseLeftButtonUp。 我试过了,它运作得很好。

 public partial class AudioPage : Page { TimeSpan _position; DispatcherTimer _timer = new DispatcherTimer(); public AudioPage() { InitializeComponent(); _timer.Interval = TimeSpan.FromMilliseconds(1000); _timer.Tick += new EventHandler(ticktock); _timer.Start(); } void ticktock(object sender, EventArgs e) { sliderSeek.Value = media.Position.TotalSeconds; } // Executes when the user navigates to this page. protected override void OnNavigatedTo(NavigationEventArgs e) { } private void Play_Click(object sender, RoutedEventArgs e) { media.Play(); } private void Pause_Click(object sender, RoutedEventArgs e) { media.Pause(); } private void Stop_Click(object sender, RoutedEventArgs e) { media.Stop(); } private void media_MediaOpened(object sender, RoutedEventArgs e) { _position = media.NaturalDuration.TimeSpan; sliderSeek.Minimum = 0; sliderSeek.Maximum = _position.TotalSeconds; } private void sliderSeek_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { int pos = Convert.ToInt32(sliderSeek.Value); media.Position = new TimeSpan(0, 0, 0, pos, 0); } } 

合作伙伴XAMl如下……

                       

我试图绑定这些值,但是没有成功:

  

太糟糕了它不起作用。
我担心你需要设置一个计时器。
就像是:

*的.xaml

  

*的.cs

  public MainWindow() { InitializeComponent(); DispatcherTimer timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromSeconds(1); timer.Tick += timer_Tick; timer.Start(); } private void timer_Tick(object sender, EventArgs e) { if (mediaPlayer.Source != null && mediaPlayer.NaturalDuration.HasTimeSpan) { testProgressBar.Minimum = 0; testProgressBar.Maximum = mediaPlayer.NaturalDuration.TimeSpan.TotalSeconds; testProgressBar.Value = mediaPlayer.Position.TotalSeconds; } } 

亲切的问候,
Thimo。

只是看看这个例子 – 而不是进度条,他使用了滑块……

将预览行为附加到WPF Slider控件

http://jobijoy.blogspot.com/2009/07/attaching-preview-behavior-to-wpf.html

一个WPF版本的Rahul样本,在滑动条形图时增加了媒体位置的实时变化。

 public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); _timer.Interval = TimeSpan.FromMilliseconds(1000); _timer.Tick += new EventHandler(ticktock); _timer.Start(); Open(@"filename.mp3"); } public void Open(string fileName) { var uriPath = "file:///" + fileName.Replace("\\", "/"); media.Source=new Uri(uriPath); } TimeSpan _position; DispatcherTimer _timer = new DispatcherTimer(); void ticktock(object sender, EventArgs e) { if (!sliderSeek.IsMouseCaptureWithin) sliderSeek.Value = media.Position.TotalSeconds; } private void Play_Click(object sender, RoutedEventArgs e) { media.Play(); } private void Pause_Click(object sender, RoutedEventArgs e) { media.Pause(); } private void Stop_Click(object sender, RoutedEventArgs e) { media.Stop(); } private void media_MediaOpened(object sender, RoutedEventArgs e) { _position = media.NaturalDuration.TimeSpan; sliderSeek.Minimum = 0; sliderSeek.Maximum = _position.TotalSeconds; } private void sliderSeek_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { int pos = Convert.ToInt32(sliderSeek.Value); media.Position = new TimeSpan(0, 0, 0, pos, 0); } private void sliderSeek_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { if (sliderSeek.IsMouseCaptureWithin) { int pos = Convert.ToInt32(sliderSeek.Value); media.Position = new TimeSpan(0, 0, 0, pos, 0); } } } 

在GitHub中有一个名为Gu.Wpf.Media的包装器库,它处理MediaElement所有问题并带来更多。

它支持通过TwoWay绑定开箱即用于绑定到Position属性。 无需为计时器烦恼。