选择列表视图项时播放音乐

play music when listview item is selected

我正在开发一款音乐应用。我已经使用 listview 将音乐文件添加到其中,但是当我单击列表视图项目播放音乐时,它会抛出 The URI is empty 异常。关于此的任何帮助。

这是我的代码

.XAML

<MediaElement x:Name="mediaElement" AreTransportControlsEnabled="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <MediaElement.TransportControls>
            <MediaTransportControls IsZoomEnabled="False" IsZoomButtonVisible='False' IsSeekBarVisible="True" IsSeekEnabled="True" IsFullWindowButtonVisible="False" IsStopButtonVisible="True"/>
        </MediaElement.TransportControls>
    </MediaElement>
    <ListView x:Name="listView" Margin="0,0,0,115" ItemClick="itemclicked" IsItemClickEnabled="True">
    </ListView>

.cs

 public MainPage()
    {
        this.InitializeComponent();

        files();
    }
    private async void files()
    {
        var query = KnownFolders.MusicLibrary.CreateFileQuery();
        var allFiles = await query.GetFilesAsync();
        foreach (var f in allFiles)
        {
            listView.Items.Add(f.DisplayName.ToString());

        }
    private void itemclicked(object sender, ItemClickEventArgs e)
    {

        mediaElement.Source = new Uri(listView.SelectedValuePath);
    }

那是因为你做错了。

您的列表仅包含作为文件显示名称的字符串。

最简单的例子可能是:

private async void files()
{
    var query = KnownFolders.MusicLibrary.CreateFileQuery();
    var allFiles = await query.GetFilesAsync();

    foreach (var f in allFiles)
    {
        listView.Items.Add(f);
    }
}

所以你将有文件,而不是名称加载到你的列表中

然后您需要获取点击的文件并将其设置为来源:

private async void itemclicked(object sender, ItemClickEventArgs e)
{
    var file = e.ClickedItem as StorageFile;
    if(file != null)
    {
        var stream = await file.OpenReadAsync();
        mediaElement.SetSource(stream, file.ContentType);
    }
}

要让列表控件显示文件名,您可以添加项目模板,例如:

<Page.Resources>
    <DataTemplate x:Key="NewItemTemplate">
        <TextBlock Text="{Binding DisplayName}"></TextBlock>
    </DataTemplate>
</Page.Resources>

<ListView x:Name="listView" Margin="0,0,0,115" ItemClick="itemclicked" IsItemClickEnabled="True" ItemTemplate="{StaticResource NewItemTemplate}">
    </ListView>

它会工作,但当然我宁愿考虑创建一些自定义项,这些项将保留对文件的引用并将它们保存在绑定到列表的 ItemsSource 的 ObservableList 中等等,而不是将原始文件放入列表中