我需要编写代码,将一些HTML(通过其他方式从外部源接收)加载到WebView中,并显示此HTML中引用的图像.这些图像将存储在Windows.Storage.ApplicationData.Current.LocalFolder中的某处.
使用本地图像的建议都没有显示在webview for windows phone 8.1或使用Webbrowser控件中的本地图像为我工作.如果我用web.NavigateToString(html)加载这样的HTML:
<html><head></head><body>A <img src="file:///c:/Users/idh/AppData/Local/Packages/d783af9f-88eb-42f5-ab0f-abb025f32baa_5cy2zb9g43kb2/LocalState/folder/image001.jpg"> B</body></html>
Run Code Online (Sandbox Code Playgroud)
我只是显示了AB.我在文件:,ms-appx:和相对路径而不是文件:等之后尝试了斜杠和反斜杠,双斜线和三斜线.图像永远不会显示.同时,如果我将其保存在HTML文件中并在我的应用程序之外打开它,它显示正常.我还成功保存并阅读了这些文件(它们实际上出现在该文件夹中,因为我的应用程序创建了它们,因此未经授权的访问不是问题).package.manifest确实包括专用网络.
我最好不要使用嵌入式base64,自定义uri解析器和其他特殊技术,因为我不是应用程序的实际开发人员.我创建了一个获取HTML并将图像保存到本地存储的库,现在我需要演示一个易于使用的方法来可视化WebView中存储的内容,就像我之前为普通.NET框架所做的那样.即我实际上是为我的库用户的开发人员编写示例,然后这些人将使用我的示例处理此HTML和图像.
作为最后的手段,我最终可以为我的样本的UWP版本编写base64或自定义解析器(而对于像普通.NET框架这样的其他平台,相同的过程要容易得多).但我想至少确保在源HTML中为图像选择正确的URL的直接途径是不可能的,我不会最终得到一些情况,我写了一些相当复杂的东西,然后有经验的UWP应用程序揭示了我过度设计了一些东西.即一些专家意见"不,在UWP中不可能,你必须使用base64嵌入或自定义URI解析"对我也有用.
虽然NavigateToString支持内容,但引用了外部文件,如CSS,脚本,图像和字体.但它仅支持使用该ms-appx-web方案的应用程序包中的内容,以及使用http和httpsURI方案的Web内容.它无法与位于apps本地文件夹中的资产一起使用.因此,使用file:///,ms-appdata:///或ms-appx:///计划不会在这里工作.
要实现您的功能,您可以使用Base64编码图像或自定义URI解析器.此外,我认为您可以将html字符串存储到存储这些图像资源的同一子文件夹下的文件中.在html中,您可以使用相对URI来引用这些资产,就像我之前的答案中所说的那样.然后使用Navigate方法和使用ms-appdata方案的Uri.例如:
var html = "<html><head></head><body>A <img src=\"image001.jpg\"> B</body></html>";
var folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("folder", CreationCollisionOption.OpenIfExists);
var file = await folder.CreateFileAsync("html.html", CreationCollisionOption.OpenIfExists);
await FileIO.WriteTextAsync(file, html);
webView.Navigate(new Uri("ms-appdata:///local/folder/html.html"));
Run Code Online (Sandbox Code Playgroud)