2016-08-03 4 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

Это потому, что вы делаете все это неправильно.

Ваш список содержит только строки, которые являются отображаемыми именами файлов.

простейший пример может быть:

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 списка и т. Д., Вместо того, чтобы помещать необработанные файлы в список

Смежные вопросы