3

我想使用它的 NavigateToString 方法将 HTML 内容加载到 WPF WebBrowser 对象中。HTML 内容包含相对路径 (*)。如何设置 WebBrowser 的基本 URL,以便正确加载所有图像、JavaScript 等?

(*) 我编辑了一个现有的、未回答的问题,以使其更易于解释。我不知道原始 OP 的应用程序;但我正在获取 HTML,对其进行修改(将突出显示应用于文本部分);然后尝试使用 .NET 4 中的 WPF WebBrowser 显示它。也许一种方法可能是在字符串中添加 HTML 前缀?

4

1 回答 1

3

需要修改页面的基本 URL。这告诉浏览器页面应该出现在哪里。首先,这可以通过使用 HTML基本标记来执行。这可以快速插入到 HTML 的开头,大多数浏览器可能会正常阅读,尽管它不是正确的 HTML。相反,它应该理想地插入标题部分(head标签)。

这是一些不优雅的 C# 代码:

    /// <summary>
    /// Insert a base href tag into the header part of the HTML
    /// If a head tag cannot be found, it is simply inserted at the beginning
    /// </summary>
    /// <param name="input_html">The HTML to process</param>
    /// <param name="url">URL for the base href tag</param>
    /// <returns>The processed HTML</returns>
    static private string InsertBaseRef(string input_html, string url)
    {
        string base_tag = "<base href=\"" + url + "\" />"; //  target=\"" + url + "\" />";
        Regex ItemRegex = new Regex(@"<head\s*>", RegexOptions.Compiled | RegexOptions.IgnoreCase);

        Match match = ItemRegex.Match(input_html);
        if (match.Success)
        {
            // only replace the first match
            return ItemRegex.Replace( input_html, match.Value + base_tag, 1 );

        }

        // not found, so insert the base tag at the beginning
        return base_tag + input_html;            
    }

请注意,这只搜索没有任何属性的简单头部标签。带有具有属性的head标签的 HTML,以及完全缺少head标签的 HTML 将在搜索中失败,并且将简单地在开头插入基本标签。是的,理想情况下,代码应该检查带有属性定义的head标签。

上述代码将在(Win7 + .NET 4 WPF)系统上正确获取相对 URL 图像。但是,它仍然存在 JavaScript 问题。我找不到合适的解决方案来类似地为所有引用的 JS 文件设置 JavaScript 基本 URL。但是,对于我的桌面应用程序,简单地抑制 JS 错误就足够了(我正在显示已修改/注释的静态页面)。可以使用此处的答案执行此抑制。由于这直接与底层浏览器 COM 对象对话,我怀疑它是否适用于 WP7。

于 2013-07-07T00:13:23.727 回答