.net - 在 WP7 中使用带有图像引用的 webBrowser.NavigatetoString()

标签 .net wpf browser

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

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

最佳答案

页面的基本 URL 需要修改。这告诉浏览器页面应该出现在哪里。首先,这可以通过使用 HTML base 标记来执行。这可以快速插入到 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 标签。带有具有属性的 head 标签的 HTML 和完全缺少 head 标签的 HTML 将无法搜索,而 base 标签将只需插入开头即可。是的,代码最好检查带有属性定义的 head 标签。

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

关于.net - 在 WP7 中使用带有图像引用的 webBrowser.NavigatetoString(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16772663/

相关文章:

C# 为字节数组或图像创建哈希

C# WPF ListView 更新

html - 浏览器兼容性问题 : layout not working in Firefox

jquery - 使用 jquery 检测 firefox 浏览器

c# - 如何在抽象类中使用构造函数注入(inject)?

.net - 移动光标位置?

c# - 使用 P-Invoke 将字符串数组从托管 C# 传递到非托管函数

wpf - 如何将 ComboBox 的 SelectedItem 绑定(bind)到作为 ItemsSource 中项目副本的对象?

wpf - 哪些原因会阻止应用显式和隐式样式?

html - 每个网页的最大 <iFrame> 标记数