在WinRT WebView控件中显示图像

时间:2012-10-22 07:19:13

标签: c# webview windows-8 httpwebrequest microsoft-metro

假设我的页面中有WebView,其内容由WebView.NavigateToString(string html)加载。现在问题是html字符串包含一些<img>标签,如

<img src="http://www.remotefakesite.com/1.jpg" />

但是除非请求有特殊的cookie,否则无法正确下载图像。但控件请求发送,我不知道如何修改请求(向其添加cookie)。我已尝试设置HttpRequest.DefaultWebProxy,但它不适用于内置控件发送的请求。

另一种解决方案是通过我自己的HttpWebRequest(使用正确的cookie)将图像下载到本地文件夹,然后将html字符串中的img标记修改为

<img src="files:///xxxxx" />

但显然files:///方案违反了metro应用的安全策略。 ms-appxms-appdata都不起作用,因为下载的图片不属于我的项目。

你有解决方案吗?

4 个答案:

答案 0 :(得分:3)

我在这里做了一些测试,如果你可以将图像下载到项目文件夹中的示例。 在“Media”文件夹中的示例,然后您可以使用以下代码打开图像:

<img src="ms-appx-web:///Media/10.jpg" />

答案 1 :(得分:2)

如果图像大小不是问题,您可以尝试使用带有所需cookie的自定义HTTP请求下载它,base64对其进行编码,然后将其插入到src属性中:

<img src="data:image/png;base64,iVBOR8Q..." />

使用NavigateToString方法将其余的html传递给WebView。

这可能不是世界上最佳解决方案,但与其他选项相比,它只是有效。

答案 2 :(得分:0)

您可以启用应用的图片库功能,并使用图片库位置下载图片。 Here is a guide on accessing pictures library

更新:

然后从图片库中的图像对象创建图像。一个例子是:

async private void LoadImage()
{
    try
    {
        IReadOnlyList<Windows.Storage.StorageFile> resultsLibrary =
            await Windows.Storage.KnownFolders.PicturesLibrary.GetFilesAsync();
        MessageBlock.Text += "Show image: " + resultsLibrary[0].Name + "\n";
        Windows.Storage.Streams.IRandomAccessStream imageStream =
            await resultsLibrary[0].OpenAsync(Windows.Storage.FileAccessMode.Read);
        Windows.UI.Xaml.Media.Imaging.BitmapImage imageBitmap =
            new Windows.UI.Xaml.Media.Imaging.BitmapImage();
        imageBitmap.SetSource(imageStream);
        ImagePlayer.Source = imageBitmap;
    }
    catch (Exception ex)
    {
        MessageBlock.Text += "Exception encountered: " + ex.Message + "\n";
    }
}

答案 3 :(得分:0)

你可以更好地使用它,就像HTML一样写:

this.InitializeComponent();

string htmContent = @" <html>
<head></head>
<body>
<img src="http://www.remotefakesite.com/1.jpg" />
</body>
</html>";

preview.NavigateToString(htmContent);

只需要一个webview元素(此处称为“预览”)