WPF Web浏览器在仍然加载图像的同时导航到byte []

时间:2015-09-11 21:04:55

标签: c# wpf webbrowser-control

我有一个WPF应用程序,它有一个显示图像,PDF或HTML网页的动态视图。我的应用程序访问Web服务以请求这些类型的文件,然后根据返回的mime类型,选择图像控件,pdf控件或WPF WebBrowser控件来呈现返回的数据。

使用图像和PDF,我可以检查mime类型,然后立即将结果中的字节数组传递给控件进行渲染。

但是,如果mime类型是HTML,那么我发现呈现html的唯一方法是将URL提供给Web浏览器控件的Navigate函数,这会导致对远程服务的第二次HTTP调用。如果可能,我被要求删除第二个请求。

我已经尝试将字节数组(e.Result)作为流传递给浏览器控件,但是,浏览器没有可引用的URL,因此无法解析相对链接的资源(如图像)。有什么方法可以将字节数组传递给Web浏览器,它仍然知道如何对相对链接的内容发出请求?

1 个答案:

答案 0 :(得分:1)

由于WPF(和WinForms)浏览器的实现方式,你无法开箱即用。从流或字符串加载时,它们将始终具有" about:blank"的URL。我想到了实现目标的选择:

  1. 通过添加
  2. 修改您下载的html
    <base href="http://your_site.com" /> 
    
    头部元素内的

    标签(如果不存在则创建头部):

    string html;
    string url = "http://google.com";
    var r = (HttpWebRequest) WebRequest.Create(url);
    using (var rs = r.GetResponse().GetResponseStream()) {
        using (var reader = new StreamReader(rs, Encoding.UTF8)) {
            html = reader.ReadToEnd();
        }
     }
     // god forbid to do it like this, example only!
     html = html.Replace("<head>", "<head><base href=\"" + url + "\"");
     wb.NavigateToString(html);
    
    1. 使用非标准浏览器。我为所有的wpf项目使用CEF(chrome embedded)浏览器,因为默认的WPF浏览器在很多方面都不能满足我的需求。 CEF的C#绑定 - https://github.com/cefsharp/CefSharp(还有其他人)。