我想使用它的 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/