2017-07-09 26 views
0

オーディオ再生の進行状況を示すスライダーがページに表示されています。しかし、それは動いていません。また、ドラッグすることで移動することはできません。常に0にとどまります。スライダのPointerPressedおよびPointerReleasedイベントを使用しています。再生中にUWPスライダーが動かない

奇妙なことに、スライダーにブレークポイントを設定した場合。最大= mediaPlayer.PlaybackSession.NaturalDuration.TotalSeconds; PlayMediaメソッドでは、それを押して再開すると、スライダはうまく動作します!!!

以下は関連するコードの一部です。

<Slider x:Name="slider" Width="Auto" Height="30" Margin="10,0,10,0" VerticalAlignment="Center" /> 


public sealed partial class MoreRuqya : Page 
{ 
    private bool bMediaStop = false; 
    private MediaPlayer mediaPlayer = new MediaPlayer(); 
    private int playIndex = 0; //media index 
    private DispatcherTimer timer = new DispatcherTimer(); 
    private DownloadFile _download = new DownloadFile(); 

    private void Page_Loaded(object sender, RoutedEventArgs e) 
    { 
     if (App.lstMoreRuqya == null) 
     { 
      App.lstMoreRuqya = DataLoader.LoadMoreRuqya(); 
     } 

     var result = from rq in App.lstMoreRuqya group rq by rq.Category into grp orderby grp.Key select grp; 

     cvsMoreRuqya.Source = result; 

     mediaPlayer.MediaEnded += MediaPlayer_MediaEnded; 
     mediaPlayer.BufferingStarted += MediaPlayer_BufferingStarted; 
     mediaPlayer.BufferingEnded += MediaPlayer_BufferingEnded; 

     //*************needed for PointerPressed & PointerReleased events to trigger********************** 
     slider.AddHandler(PointerPressedEvent, new PointerEventHandler(Slider_PointerPressed), true); 
     slider.AddHandler(PointerReleasedEvent, new PointerEventHandler(slider_PointerReleased), true); 
     //************************************************************************************************ 

     _download.Status += _download_Status; 

     if (mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Playing) 
     { 
      Play.Symbol = Symbol.Pause; 
     } 
     else 
     { 
      Play.Symbol = Symbol.Play; 
     } 

     InitializeTimer(); 
    } 

    private void MediaPlayer_BufferingStarted(MediaPlayer sender, object args) 
    { 
     lblMediaInfo.Text = "Buffering..."; 
    } 

    private void MediaPlayer_BufferingEnded(MediaPlayer sender, object args) 
    { 
     slider.Maximum = mediaPlayer.PlaybackSession.NaturalDuration.TotalSeconds; 
    } 

    private void MediaPlayer_MediaEnded(MediaPlayer sender, object args) 
    { 
     PlayNext(); 
    } 

    private void btnPlay_Click(object sender, RoutedEventArgs e) 
    { 
     //filter list for only selected items 
     var selected = from rq in App.lstMoreRuqya where rq.isSelected == true select rq; 
     App.lstSelectedMoreRuqya = selected.ToList(); 

     if (Play.Symbol.Equals(Symbol.Play)) 
     { 
      if (mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Paused & !bMediaStop) 
      { 
       mediaPlayer.Play(); 
      } 
      else 
      { 
       bMediaStop = false; 
       PlayMedia(playIndex); 
      } 

      Play.Symbol = Symbol.Pause; 

      timer.Start(); 
     } 
     else if (Play.Symbol.Equals(Symbol.Pause)) 
     { 
      mediaPlayer.Pause(); 

      Play.Symbol = Symbol.Play; 

      timer.Stop(); 
     } 
    } 

    private void PlayMedia(int index) 
    { 
     //if past last item in playlist & last item has been repeated 
     if (index > App.lstSelectedMoreRuqya.Count || App.lstSelectedMoreRuqya.Count == 0) 
     { 
      Play.Symbol = Symbol.Play; 

      return; 
     } 

     string uri = App.lstSelectedMoreRuqya[playIndex].urlPath; 

     mediaPlayer.Source = MediaSource.CreateFromUri(new Uri(uri)); 
     mediaPlayer.AutoPlay = true; 

     slider.Maximum = mediaPlayer.PlaybackSession.NaturalDuration.TotalSeconds; 
    } 

    private void timer_Tick(object sender, object e) 
    { 
     if (mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.None) 
     { 
      lblMediaInfo.Text = ""; 
     } 

     if (mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Playing) 
     { 
      slider.Value = Convert.ToDouble(mediaPlayer.PlaybackSession.Position.Seconds); 
      lblMediaInfo.Text = App.lstSelectedMoreRuqya[playIndex].RuqyaName + " (" + FormatDuration(mediaPlayer.PlaybackSession.Position) + "/" + FormatDuration(mediaPlayer.PlaybackSession.NaturalDuration) + ")"; 
     } 
    } 

    private void InitializeTimer() 
    { 
     timer.Interval = TimeSpan.FromMilliseconds(1000); 
     timer.Tick += timer_Tick; 

     timer.Start(); 
    } 

    private void Slider_PointerPressed(object sender, PointerRoutedEventArgs e) 
    { 
     timer.Stop(); 
    } 

    private void slider_PointerReleased(object sender, PointerRoutedEventArgs e) 
    { 
     mediaPlayer.PlaybackSession.Position = TimeSpan.FromSeconds(slider.Value); 
     timer.Start(); 
    } 
} 

答えて

2

また、それはドラッグして移動することができない、それは常に

slider.Maximum = mediaPlayer.PlaybackSession.NaturalDuration.TotalSeconds; 

が最大値を取得し、それを次のコード行によって引き起こされる0

にとどまりますスライダーを0に設定してください。スライダーの値を0以上に設定することはできません。System.Diagnostics.Debug.WriteLine(slider.Maximum);を追加してテストすることができます。なぜNaturalDuration.TotalSecondsが0の結果を得たのかの理由は、MediaPlayerPlaybackSessionが開かれていないことが必要です。

これを解決するより良い方法は、OpenOperationCompletedの後にMediaSourceの継続時間を取得することです。例:

private void PlayMedia(int index) 
{ 
    MediaSource mediasource = MediaSource.CreateFromUri(new Uri("ms-appx:///Assets/test.mp3")); 
    mediasource.OpenOperationCompleted += Mediasource_OpenOperationCompleted; 
    mediaPlayer.Source = mediasource; 
    mediaPlayer.AutoPlay = true; 
    //slider.Maximum = mediaPlayer.PlaybackSession.NaturalDuration.Seconds; 
    //System.Diagnostics.Debug.WriteLine(slider.Maximum); 
} 

private async void Mediasource_OpenOperationCompleted(MediaSource sender, MediaSourceOpenOperationCompletedEventArgs args) 
{  
    var _duration = sender.Duration.GetValueOrDefault(); 
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
    {   
     slider.Minimum = 0; 
     slider.Maximum = _duration.TotalSeconds; 
     slider.StepFrequency = 1; 
    }); 
} 

詳細はUse MediaTimelineController to synchronize content across multiple playersを参照してください。このセクションには、スライダサンプルが含まれています。

+0

これは機能します。どうもありがとうございました。 –

関連する問題