翻转查看数据绑定和文件权限

时间:2017-09-04 21:23:52

标签: c# xaml uwp windows-10

我正在学习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等解决方案或类似问题解决此问题 我错过了什么? 谢谢。

2 个答案:

答案 0 :(得分:0)

UWP应用程序无权访问设备上的所有文件。默认情况下,应用程序可以访问某些文件系统位置,例如应用程序安装目录或应用程序数有关详细信息,请参阅File access permissions

"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

答案 1 :(得分:0)

好, 所以使用@Jayden的答案形式,我设法找到了解决方案。 开始, 在UWP应用程序中,使用文件*的直接路径可能会失败,原因是要么是权限,要么是路径,就像我想说的那样,“虚拟目录”。一个例子是照片或音乐收藏。所有文件都被填充并“发送”到请求应用程序。此外,文件可能来自另一个应用程序。因此存储字符串毫无意义。

  

文件的受保护视图由StorageItems类提供(即StorageFolderStorageFile)。 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>

这是我提出的一个基本解决方案,欢迎任何改进/优化! 谢谢!