[英]play music when listview item is selected
我正在開發音樂應用。 我曾使用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);
}
這是因為您做錯了所有事情。
您的列表僅包含作為文件的DisplayName的字符串。
最簡單的示例可能是:
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中,依此類推,而不是將原始文件放入列表中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.