【问题标题】:How to stop music playing after last song in `Listview`如何在“Listview”中的最后一首歌曲之后停止播放音乐
【发布时间】:2020-06-09 15:07:17
【问题描述】:

在我的 Raspberry pi3 的 UWP 应用程序中,我有一个音乐播放器,可以播放来自 ListView 的歌曲。您可以在ListView 中选择任何一首歌曲,然后它会自动播放下一首歌曲。我面临的问题是,当它到达最后一首歌曲并完成时,它会再次播放并且不会停止。就像它在最后一首歌曲中循环播放,而不是在播放完后停止。

有人可以指导我如何停止循环吗?

这是我的代码:

    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 void mediaItemList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

    }

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

    private async void objMediaPlayer_MediaEnded(object sender, RoutedEventArgs e)
    {
        if (AudioFilesLV.SelectedIndex <= AudioFilesLV.Items.Count)
        {
            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();
            }
        }
        else
        {
            mediaElement.Stop();
        }
    }

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 在 selectedIndex if 语句中尝试使用
  • 您好,谢谢,我试过了,但没有用,仍然重复播放最后一个。

标签: c# uwp


【解决方案1】:

您好,欢迎来到 stackoverflow, 问题可能出在事件 objMediaPlayer_MediaEnded 的 if 条件的第一行。因为你到达列表的末尾并设置

AudioFilesLV.SelectedIndex = AudioFilesLV.SelectedIndex = 1;

SelectedIndex 现在应该再次小于 AudioFilesLV.Items.Count。

该行应更改为:

AudioFilesLV.SelectedIndex = AudioFilesLV.SelectedIndex + 1;

因为那么你在 if 情况下计算 SelectedIndex。目前,SelectedIndex 应始终为 1。

如果你需要计算 SelectedIndex 来选择下一首歌曲,她就是一个例子:

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

然后告诉你我为什么这样做:

(AudioFilesLV.SelectedIndex + 1)

在示例中。因为在每种情况下,AudioFilesLV.SelectedIndex(SelectedIndex 从 0 开始)都比 AudioFilesLV.Items.Count(Count 从 1 开始)小一。

希望对你有帮助。

【讨论】:

  • 谢谢,没听懂你说的。你能按照我上面的代码举个例子吗?
  • 您好,我希望示例没问题,可以帮助您解决问题。
  • 太棒了,谢谢你现在正在工作,也谢谢你的解释!!
【解决方案2】:

试试这个,

private async void objMediaPlayer_MediaEnded(object sender, RoutedEventArgs e)
    {
        AudioFilesLV.SelectedIndex += 1;
        if (AudioFilesLV.SelectedIndex <= AudioFilesLV.Items.Count - 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();
            }
        }
        else
        {
            mediaElement.Stop();
        }
    }

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多