2016-08-03 3 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에 보관하는 몇 가지 사용자 정의 항목을 작성하는 것이 좋습니다. 원시 파일을 목록에 넣는 것보다