简体   繁体   English

MediaElement Windows Phone 8.1的滑块进度栏

[英]Slider progress bar with MediaElement Windows Phone 8.1

I am working within a Windows Phone 8.1 (non SilverLight) application. 我正在Windows Phone 8.1(非SilverLight)应用程序中工作。 I have a MediaElement AudioPlayer that plays audio files. 我有一个播放音频文件的MediaElement AudioPlayer I also have a Slider AudioPlayerSeek that I want 'hooked' to the MediaElement, so that it moves as the audio is playing. 我也有一个Slider AudioPlayerSeek ,我想将它“钩”到MediaElement,以便它在播放音频时移动。

I have gone through this tutorial word for word, but still can't get it to work. 我已经逐字逐句地学习了本教程 ,但是仍然无法使它正常工作。 When I play my audio (clicking on an item in a ListView), the audio plays, but the Slider doesn't move! 当我播放音频时(单击ListView中的一个项目),音频会播放,但是Slider不会移动!

private DispatcherTimer _timer;
private bool _sliderpressed = false;

// Constructor
public MainPage()
{
    InitializeComponent();
    NavigationCacheMode = NavigationCacheMode.Required;
    AudioPlayerSeek.ValueChanged += AudioPlayerSeek_ValueChanged;
    InitializeAudioRecording();
    DataContext = App.ViewModel;
}

// Called when I select my Audio file in the ListView
private async void Selector_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // Cast to XAML ListView
    var listView = sender as ListView;

    // Verify we have ListView
    if (listView == null) { return; }

    var listVmItem = listView.SelectedItem as RecordFileVm;

    if (listVmItem != null)
    {
        var file2 = await _finalStorageFolder.GetFileAsync(listVmItem.FileName);
        var stream = (await file2.OpenReadAsync()).AsStream().AsRandomAccessStream();
        AudioPlayer.SetSource(stream, file2.ContentType);
        TimeSpan recordingTime = AudioPlayer.NaturalDuration.TimeSpan;
        AudioPlayerSeek.Maximum = recordingTime.TotalSeconds;
        AudioPlayerSeek.SmallChange = 1;
        AudioPlayerSeek.LargeChange = Math.Min(10, recordingTime.Seconds / 10);
        AudioPlayer.MediaOpened += AudioPlayer_MediaOpened;
        AudioPlayer.CurrentStateChanged += AudioPlayer_CurrentStateChanged;
        AudioPlayer.Play();
    }

    // Clear selection
    listView.SelectedItem = null;
}

private double SliderFrequency(TimeSpan timevalue)
{
    double stepfrequency = -1;

    double absvalue = (int)Math.Round(timevalue.TotalSeconds, MidpointRounding.AwayFromZero);

    stepfrequency = (int)(Math.Round(absvalue / 100));

    if (timevalue.TotalMinutes >= 10 && timevalue.TotalMinutes < 30)
    {
        stepfrequency = 10;
    }
    else if (timevalue.TotalMinutes >= 30 && timevalue.TotalMinutes < 60)
    {
        stepfrequency = 30;
    }
    else if (timevalue.TotalHours >= 1)
    {
        stepfrequency = 60;
    }

    if (stepfrequency == 0) stepfrequency += 1;

    if (stepfrequency == 1)
    {
        stepfrequency = absvalue / 100;
    }

    return stepfrequency;
}

void AudioPlayerSeek_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
    if (!_sliderpressed)
    {
        AudioPlayer.Position = TimeSpan.FromSeconds(e.NewValue);
    }
}

private void SetupTimer()
{
    _timer = new DispatcherTimer();
    _timer.Interval = TimeSpan.FromSeconds(AudioPlayerSeek.StepFrequency);
    StartTimer();
}

private void _timer_Tick(object sender, object e)
{
    if (!_sliderpressed)
    {
        AudioPlayerSeek.Value = AudioPlayer.Position.TotalSeconds;
    }
}

private void StartTimer()
{
    _timer.Tick += _timer_Tick;
    _timer.Start();
}

I believe that is the relevant code. 我相信这是相关的代码。 Can someone please tell me how I can synchronize my slider so that it moves with the playing media (audio). 有人可以告诉我如何同步滑块,使其随正在播放的媒体(音频)一起移动。

Thank you. 谢谢。

You are setting things up in the wrong order. 您设置顺序错误。 Try changing it to this: 尝试将其更改为此:

 if (listVmItem != null)
{
    var file2 = await _finalStorageFolder.GetFileAsync(listVmItem.FileName);
    var stream = (await file2.OpenReadAsync()).AsStream().AsRandomAccessStream();
    AudioPlayer.MediaOpened += AudioPlayer_MediaOpened;
    AudioPlayer.CurrentStateChanged += AudioPlayer_CurrentStateChanged;
    AudioPlayer.SetSource(stream, file2.ContentType);
    AudioPlayer.Play();
}

and move these calls to the MediaOpened handler: 并将这些调用移至MediaOpened处理程序:

    TimeSpan recordingTime = AudioPlayer.NaturalDuration.TimeSpan;
    AudioPlayerSeek.Maximum = recordingTime.TotalSeconds;
    AudioPlayerSeek.SmallChange = 1;
    AudioPlayerSeek.LargeChange = Math.Min(10, recordingTime.Seconds / 10);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM