我正在学习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 ItemsSource,Flipview not showing any pictures和Show image files from a directory in a Flipview等解决方案或类似问题解决此问题 我错过了什么? 谢谢。
答案 0 :(得分:0)
UWP应用程序无权访问设备上的所有文件。默认情况下,应用程序可以访问某些文件系统位置,例如应用程序安装目录或应用程序数有关详细信息,请参阅File access permissions。
"F:\Test Sp Folder\1.png"
是您的应用无法直接访问的位置。在处理UWP中的文件或文件夹时,一个重要规则是Skip the path: stick to the StorageFile。
建议您使用FolderPicker
让用户选择该文件夹并将其添加到您应用的FutureAccessList
或MostRecentlyUsedList
,这样就可以在以后重新加载它们而不需要用户通过选择器。有关详细信息,请查看:How to track recently-used files and folders。
答案 1 :(得分:0)
好, 所以使用@Jayden的答案形式,我设法找到了解决方案。 开始, 在UWP应用程序中,使用文件*的直接路径可能会失败,原因是要么是权限,要么是路径,就像我想说的那样,“虚拟目录”。一个例子是照片或音乐收藏。所有文件都被填充并“发送”到请求应用程序。此外,文件可能来自另一个应用程序。因此存储字符串毫无意义。
文件的受保护视图由
StorageItems
类提供(即StorageFolder
和StorageFile
)。StorageItems
是Windows应用商店应用的规范存储标识符,而不是路径。如果您根据StorageItems思考和工作,而不是尝试在StorageItems
和路径之间来回转换,那么您的生活(和您的应用程序)会更容易。StorageFile
的一个关键属性是它不限于文件系统对象。例如,StorageFile
可以表示用户通过文件选择器合同从另一个应用程序中选择的照片“文件”。该应用处理StorageFile
,无需知道或关心数据是源自磁盘还是其他应用。相反,需要知道数据来源的应用程序可能会遇到麻烦:StorageFile
可能没有路径或者可能有非文件系统路径。
所以要克服这个问题,必须使用StorageFile
来保证对文件的访问(假设你已经拥有了它的权限)。还记得存储您的访问权限!
Windows.Storage.AccessCache
命名空间提供了要记住StorageItems
的类,以便以后可以重新加载它们,而无需用户通过选择器。StorageApplicationPermissions.FutureAccessList
提供对之前使用过的项目的随机访问。MostRecentlyUsedList
允许保留最近使用的位置列表。
在经历了多个例子和无数次试验之后,我找到了解决方案,我意识到它类似于链接的question。
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 ) {
}
}
}
它不是通过字符串和Uri访问文件,而是使用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>
这是我提出的一个基本解决方案,欢迎任何改进/优化! 谢谢!