我正在开发一个音乐应用程序。我已经使用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);
}
答案 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等等,而不是将原始文件放入列表中