2017-09-04 50 views
1

我正在學習Windows 10中的UWP和應用程序製作的基礎知識。 我正在嘗試使用從數據文件夾中拉出的數據進行翻轉視圖。它沒有顯示任何圖像,所以我嘗試手動添加圖像像這樣,翻轉查看數據綁定和文件權限

PrivateSet_images.Add(new BitmapImage(new Uri("ms-appx:///Assets/Spot/1.png"))); 
PrivateSet_images.Add(new BitmapImage(new Uri("ms-appx:///Assets/Spot/2.png"))); 

PrivateSet_images.Add(new BitmapImage(new Uri("ms-appx:///Assets/Spot/jpg.jpg"))); 
PrivateSet_images.Add(new BitmapImage(new Uri("ms-appx:///Assets/Spot/jpeg.jpeg"))); 
PrivateSet_images.Add(new BitmapImage(new Uri("ms-appx:///Assets/Spot/jpg.png"))); 
PrivateSet_images.Add(new BitmapImage(new Uri("ms-appx:///Assets/Spot/jpeg.png"))); 

PrivateSet_images.Add(new BitmapImage(new Uri("F:\\Test Sp Folder\\1.png"))); 
PrivateSet_images.Add(new BitmapImage(new Uri("F:/Test Sp Folder/1.png"))); 

所有MS-APPX資產閱讀併成功地顯示出來(所以不是一個文件類型/文件擴展名的問題)。至於文件夾的權限,我使用文件夾選取器來訪問幾個文件,因此沒有權限問題(如here所述)。我檢查了調試器,文件被正確讀取,但最後兩個文件沒有顯示(指向同一個文件,我想確保它不是'/''\\'阻止它們被顯示。)

XAML代碼:

<FlipView x:Name="FlipViwe" ItemsSource="{x:Bind ViewModel.Images}" Visibility="Visible"> 
    <FlipView.ItemTemplate> 
    <DataTemplate> 
     <Image Source="{Binding}" Stretch="Fill"/> 
    </DataTemplate> 
    </FlipView.ItemTemplate> 
</FlipView> 

我似乎並沒有能夠與解決方案或類似Bind a Collection as ItemsSourceFlipview not showing any picturesShow image files from a directory in a Flipview 我缺少類似的問題來解決這個問題? 謝謝。

+0

您能否介紹一下F:\的更多信息。 F是本地驅動器還是遠程驅動器? –

+0

@StuartSmith F:是本地硬盤分區 –

回答

0

好吧, 所以用@Jayden的答案,我設法找到了解決方案。 Here, 在UWP應用程序中,使用直接路徑到文件*可能會失敗,原因是權限或路徑,正如我喜歡說的那樣,「虛擬目錄」。一個例子是照片或音樂收藏。所有文件都被填充併發送到請求的應用程序。此外,這些文件可能來自另一個應用程序。所以存儲這些字符串是毫無意義的。

的文件的受保護視圖由StorageItems類(即StorageFolderStorageFile和)提供。 StorageItems是Windows Store應用程序的規範存儲標識符,而不是路徑。如果您考慮並按照StorageItems工作而不是試圖在StorageItems和路徑之間來回轉換,那麼您的生活(和您的應用)將會更容易。 StorageFile的一個關鍵屬性是它不限於文件系統對象。例如,StorageFile可以表示用戶通過文件選擇器合同從另一個應用程序中選擇的照片「文件」。該應用程序處理StorageFile,不需要知道或關心數據是源自磁盤還是其他應用程序。相反,需要知道數據來源的應用程序可能會遇到麻煩:StorageFile可能沒有Path或可能有非文件系統路徑。

所以爲了克服這個問題,我們必須使用StorageFile,它保證對文件的訪問(假設你已經有權限)。還請記住存儲您的訪問權限!

Windows.Storage.AccessCache命名空間提供的類要記住StorageItems,使他們能夠在以後重新加載,而不需要用戶去通過選擇器。 StorageApplicationPermissions.FutureAccessList提供對先前已使用的項目的隨機訪問。 MostRecentlyUsedList允許保留最近使用的位置的列表。

經歷了多個例子和無數次試驗後,我碰到了解決方案,我意識到它與鏈接question類似。

而不是通過字符串和URI訪問文件
public async void ImageViewGenerateAsync() { 
var ImagesFolder = await StorageApplicationPermissions. 
          FutureAccessList.GetFolderAsync("FolderFoken"); 

var ImgFiles = await ImagesFolder.GetFilesAsync(); 
foreach(StorageFile file in ImgFiles) { 
    if (file != null) { 
     try { 
      var filestream = await file.OpenAsync(FileAccessMode.Read); 
      var img = new BitmapImage(); 

      await img.SetSourceAsync (filestream); 
      PrivateSet_images.Add(img); 
     } 
     catch (Exception) {       
     } 
    } 
} 

它,使用StorageFile處理該文件給你。然後通過OpenAsync讀取文件並將此流設置爲BitmapImage的源(描述here,向下滾動到使用流源顯示圖片庫中的圖像)。我不確定這是一個優化的解決方案,但它有效。我很想看看是否有更好的優化解決方案。

XAML:

<FlipView x:Name="FlipViweSpotlight" ItemsSource="{x:Bind ViewModel.Images}" Visibility="Visible"> 
<FlipView.ItemTemplate> 
<DataTemplate> 
    <Image Source="{Binding}" Stretch="Uniform"/> 
</DataTemplate> 

</FlipView.ItemTemplate> 

這是我想出了一個基本的解決方案,任何改進/優化會受到歡迎! 謝謝!

0

UWP應用程序沒有權限訪問設備上的所有文件。默認情況下,應用可以訪問某些文件系統位置,如應用程序安裝目錄或應用程序數據位置。欲瞭解更多信息,請參閱。

"F:\Test Sp Folder\1.png"是您的應用無法直接訪問的位置。在處理UWP中的文件或文件夾時,一個重要規則是Skip the path: stick to the StorageFile

這是推薦使用Folder​Picker來讓用戶選擇的文件夾並將其添加到您的應用程序的FutureAccessListMostRecentlyUsedList,通過這種方式,他們可以在以後重新加載,而不需要用戶去通過選擇器。欲瞭解更多信息,請檢查:How to track recently-used files and folders

+0

我經歷了_Skip Path_文章,並意識到直接使用路徑並不能保證能正常工作(謝謝!)。我會在成功或失敗後儘快更新你。但是我之前訪問過上述目錄中的文件,所以在訪問權限方面沒有問題。如果我沒有訪問該文件夾的權限,最後一個Uri會拋出一個異常。沒有例外,所以我假設我對訪問很好。 –

+0

我找到了答案,謝謝你的提醒!我詳細介紹了我的發現作爲答案。 –