从商店部署时,从UWP应用程序共享图像失败

时间:2016-03-14 22:52:45

标签: c# win-universal-app

无法想象什么是goind.Tried两个:

StorageFile thumbnailFile = await Package.Current.InstalledLocation.GetFileAsync("Assets\\foo.png");

StorageFile thumbnailFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/foo.png")); 将foo.png标记为内容

在visual studio(调试和发布)中运行非常好,以及运行visual studio部署的应用程序时。

但是如果我创建包并使用powershell脚本手动安装,我会收到可疑的 FileNotFoundException

有人可以解释发生了什么......?

1 个答案:

答案 0 :(得分:0)

此处的问题与您想要检索的StoreLogo.scale-100.png有关。

当我们使用 App bundles 创建应用包时,它会为不同的特定语言和图片级资产生成多个包。

  

对于面向Windows 8.1,Windows Phone 8.1及更高版本的应用程序,Visual Studio可以生成应用程序包(.appxbundle)以减小用户下载的应用程序的大小。如果您已定义特定于语言的资产,各种图像规模资源或适用于特定版本的Microsoft DirectX的资源,则此功能非常有用。

     

使用应用程序包,用户只会下载相关文件,而不是所有可能的资源。

使用PowerShell手动安装应用后,我们可以在" C:\ Program Files \ WindowsApps" 中找到该应用。对于您的样本,包可能如下: enter image description here

在主包的Assets文件夹中,它包含以下图像: enter image description here

StoreLogo.scale-100.png位于 scale-100 卫星应用套餐下: enter image description here

这是因为主应用程序包包含任何默认比例的资源。并且

  

通用Windows应用的默认资产规模为200.(请参阅:Migrate apps to the Universal Windows Platform (UWP)

如果我们使用Package.Current.InstalledLocation.Path来获取已安装的路径,我们会发现它返回主应用包的路径,如:

  

C:\ Program Files \ WindowsApps \ 2c33274f-13c1-47cf-a1e6-f64a5175e8e5_1.0.6.0_x64__9wkhgz7fyfewr。

因此,当您使用StorageFile thumbnailFile = await Package.Current.InstalledLocation.GetFileAsync("Assets\\StoreLogo.scale-100.png");检索StoreLogo.scale-100.png时,您将获得FileNotFoundException,因为它不在该文件夹下。

作为一种解决方法,我们可以删除StoreLogo.scale-100.png中的限定符并将其名称更改为其他名称,以便它可以包含在主应用程序包中。或者,我们可以将"生成应用包" 设置为"从不" ,以避免生成图片级卫星应用包,例如: enter image description here

如果您确实需要使用图片级资源并想要获得应用包的好处,可以尝试使用 Resource Management System 来检索特定比例图像。

  

ResourceManager 不仅支持访问应用程序的字符串资源,还可以枚举和检查各种文件资源。为了避免文件与源自文件内的其他资源之间的冲突,索引文件路径都驻留在保留的文件中。 ResourceMap 子树。例如,文件images / logo.png对应于资源名称Files / images / Logo.png。

     

StorageFile API透明地将对文件的引用作为资源处理,并且适用于典型的使用方案。 ResourceManager 只应用于高级方案,例如重写的上下文或可能值的枚举。

因此我们可以检索特定比例图像,如下所示:

ResourceMap resMap = ResourceManager.Current.MainResourceMap.GetSubtree("Files");
var resourceContext = new ResourceContext();
resourceContext.QualifierValues["scale"] = "100";
StorageFile thumbnailFile = await resMap.GetValue("Assets/StoreLogo.png", resourceContext).GetValueAsFileAsync();