【问题标题】:Slider progress bar with MediaElement Windows Phone 8.1带有 MediaElement Windows Phone 8.1 的滑块进度条
【发布时间】:2015-06-18 16:54:35
【问题描述】:

我正在使用 Windows Phone 8.1(非 SilverLight)应用程序。我有一个播放音频文件的 MediaElement AudioPlayer。我还有一个 Slider AudioPlayerSeek,我想将它“连接”到 MediaElement,以便它在播放音频时移动。

我逐字逐句地检查了this tutorial,但仍然无法正常工作。当我播放音频(单击 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();
}

我相信这是相关的代码。有人可以告诉我如何同步我的滑块,以便它与正在播放的媒体(音频)一起移动。

谢谢。

【问题讨论】:

  • 您的timer_Tick 函数中的AudioPlayerSeek.Value = AudioPlayer.Position.TotalSeconds; 行是否以正确的值执行?
  • 是的,当我在 Debug 中将鼠标悬停在 AudioPlayerSeek.Value 上时,它显示该值为 7.78 秒。

标签: c# xaml slider windows-phone-8.1 mediaelement


【解决方案1】:

您的设置顺序错误。尝试将其更改为:

 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();
}

并将这些调用移至 MediaOpened 处理程序:

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

【讨论】:

  • 谢谢@Jon,我试过了,但还是不行。我的音频播放,但滑块不移动:(我创建了这个GitHub Gist,这样你就可以看到所有的代码。
  • 想通了,太傻了!它工作正常,但是因为我的 Slider 没有宽度并且位于宽度为 Auto 的 Grid 列内,所以我没有看到任何移动。故事的寓意,确保您的滑块有宽度(在设计视图中单击它)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多