在UWP WebView控件

时间:2016-12-30 18:37:33

标签: c# webview uwp

我需要编写代码,将一些HTML(通过其他方式从外部源接收)加载到WebView中,并显示此HTML中引用的图像。这些图像将存储在Windows.Storage.ApplicationData.Current.LocalFolder中的某处。

use local image to display in webview for windows phone 8.1Use local images in Webbrowser control的任何建议都不适合我。如果我用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>

我只显示了A B.我在文件:,ms-appx:和相对路径而不是file:等之后尝试了斜杠和反斜杠,双斜线和三斜线。图像永远不会显示。同时,如果我将其保存在HTML文件中并在我的应用程序之外打开它,它显示正常。我还成功保存并阅读了这些文件(它们实际上出现在该文件夹中,因为我的应用程序创建了它们,因此未经授权的访问不是问题)。 package.manifest确实包含私有网络。

我最好不要使用嵌入式base64,自定义uri解析器和其他特殊技术,因为我不是应用程序的实际开发人员。我创建了一个获取HTML并将图像保存到本地存储的库,现在我需要演示一个易于使用的方法来可视化WebView中存储的内容,就像我之前为普通.NET框架所做的那样。即我实际上是为我的库用户的开发人员编写一个示例,然后这些人将使用我的示例来处理这些HTML和图像。

作为最后的手段,我最终可以为我的样本的UWP版本编写base64或自定义解析器(而对于像普通.NET框架这样的其他平台,相同的过程要容易得多)。但我想至少确保在源HTML中为图像选择正确的URL的直接途径是不可能的,我不会最终遇到一些情况,我写了一些相当复杂的东西,然后有经验的UWP应用程序揭示我过度设计的东西。即一些专家意见&#34;不,它在UWP中是不可能的,你必须使用base64嵌入或自定义URI解析&#34;对我也有用。

1 个答案:

答案 0 :(得分:6)

虽然NavigateToString支持内容引用外部文件,如CSS,脚本,图像和字体。但仅支持使用ms-appx-web方案的应用包中的内容,以及使用httphttps URI方案的网络内容。它无法与位于apps本地文件夹中的资产一起使用。因此,使用file:///ms-appdata:///ms-appx:///方案将不起作用。

要实现您的目标,您可以使用 Base64编码图像自定义URI解析器。此外,我认为您可以将html字符串存储到存储这些图像资源的同一子文件夹下的文件中。在html中,您可以使用相对URI来引用这些资产,例如my previous answer中的资产。然后使用Navigate方法和Uri使用ms-appdata scheme。例如:

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"));