我想使用它的NavigateToString方法将HTML内容加载到WPF WebBrowser对象中。 HTML内容包含相对路径(*)。如何设置WebBrowser的基本URL以便正确加载所有图像,JavaScript等?
(*)我编辑了一个现有的,未回答的问题,使其更加自我解释。我不知道原始OP的应用程序;但我正在获取HTML,修改它(将高亮显示应用于文本部分);然后尝试使用.NET 4中的WPF WebBrowser显示它。也许一种方法可能是在字符串中添加HTML前缀?
答案 0 :(得分:3)
需要修改页面的基本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。