2016-08-03 8 views
0

私は音楽アプリを開発中です。私は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

これはどのように動作するのか分かりません。この名前が示すように、[StorageFile.DisplayName](https://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.storagefile.displayname.aspx)は、ファイルのユーザーフレンドリーな名前を返します。ファイルパスではありません。また、[SelectedValuePath](https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedvaluepath.aspx)は、データバインディングで使用されます(XAMLでは使用しません) )。あなたはまだデバッガの使用を検討しましたか? – IInspectable

答えて

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> 

これはうまくいくはずですが、もちろん、ファイルへの参照を保持し、リストのItemsSourceにバインドされたObservableListに保持するカスタム項目を作成することを考えています。

関連する問題