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

时间:2016-08-03 13:25:56

标签: c# listview uwp mediaelement

我正在开发一个音乐应用程序。我已经使用listview将音乐文件添加到其中但是当我点击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);
    }

1 个答案:

答案 0 :(得分:1)

这是因为你做错了。

您的列表仅包含文件的DisplayNames字符串。

最简单的例子可能是:

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>

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