【问题标题】:How to play next song automatically after last song has played UWPUWP播放完最后一首歌曲后如何自动播放下一首歌曲
【发布时间】:2020-06-18 22:25:22
【问题描述】:

在我的ListView 中播放完最后一首歌曲后,我正在努力自动播放下一首歌曲

我有一个ListView,它显示所有带有专辑、专辑封面和标题的歌曲,当点击一首歌曲时,它会播放那首歌曲,但当移动到下一首歌曲时,它会再次播放第一首歌曲。即使我单击列表中的下一首歌曲,它也会再次播放第一首歌曲?

我真的被这个难住了。

这是我的代码:

private async Task InitFolderAsync()
    {
        StorageFolder musicLib = KnownFolders.MusicLibrary;
        var files = await musicLib.GetFilesAsync();
        foreach (var file in files)
        {
            StorageItemThumbnail currentThumb = await file.GetThumbnailAsync(ThumbnailMode.MusicView, 50, ThumbnailOptions.UseCurrentScale);
            var albumCover = new BitmapImage();
            albumCover.SetSource(currentThumb);

            var musicProperties = await file.Properties.GetMusicPropertiesAsync();
            var musicname = musicProperties.Title;
            var musicdur = musicProperties.Duration;

            var artist = musicProperties.Artist;
            if (artist == "")
            {
                artist = "Unknown";
            }

            var album = musicProperties.Album;
            if (album == "")
            {
                album = "Unkown";
            }
            MusicList.Add(new MusicLib
            {
                FileName = musicname,
                Artist = artist,
                Album = album,
                Duration = musicdur,
                AlbumCover = albumCover,
                MusicPath = file.Path
            });

        }
    }


private async void SongClicked(object sender, ItemClickEventArgs e)
    {
        var file = await KnownFolders.MusicLibrary.GetFileAsync(e.ClickedItem.ToString());

        if (file != null)
        {
            var stream = await file.OpenReadAsync();
            mediaElement.SetSource(stream, file.ContentType);
            mediaElement.Play();
        }

    }

    private async void objMediaPlayer_MediaEnded(object sender, RoutedEventArgs e)
    {
        // If the end of the ListView is reached and the last song was played stop.
        if ((AudioFilesLV.SelectedIndex + 1) == AudioFilesLV.Items.Count)
        {
            mediaElement.Stop();
        }
        else
        {
            // This line you should try to change. When the last song was not played 
            //-> select next one and play them.
            AudioFilesLV.SelectedIndex = AudioFilesLV.SelectedIndex + 1;
            var file = await KnownFolders.MusicLibrary.GetFileAsync(AudioFilesLV.SelectedItem.ToString());
            if (file != null)
            {
                var stream = await file.OpenReadAsync();
                mediaElement.SetSource(stream, file.ContentType);
                mediaElement.Play();
            }
        }
    }

    private void objMediaPlayer_MediaOpened(object sender, RoutedEventArgs e)
    {
        mediaElement.Play();
    }

【问题讨论】:

  • 所以SongClickedobjMediaPlayer_MediaEnded 都不能按预期工作?请分享您的 XAML 标记。

标签: c# uwp


【解决方案1】:

很难说为什么它不能使用您提供的代码。对我来说,它看起来应该工作。也许由于某种原因,您在 GetFileAsync 方法中获得了相同的文件,而不是新文件。无论如何,与其自己处理播放列表并使用过时的 MediaElement,我建议您使用 MediaPlayerElement 和内置组件 MediaPlaybackList 甚至 MediaPlayer 本身与 MediaPlaybackList。您可以在此处阅读有关 MediaPlaybackList 的信息:https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/media-playback-with-mediasource

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多