选择列表视图项时播放音乐
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 中等等,而不是将原始文件放入列表中
我正在开发一款音乐应用。我已经使用 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 中等等,而不是将原始文件放入列表中