オーディオ再生の進行状況を示すスライダーがページに表示されています。しかし、それは動いていません。また、ドラッグすることで移動することはできません。常に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();
}
}
これは機能します。どうもありがとうございました。 –