我正在使用 WPFSystem.Windows.Controls.WebBrowser
控件来显示一些从服务下载的 HTML 内容。有时 HTML 包含应该可以点击的 URL(“a”元素)。
默认情况下,当单击此类 URL 时,它会在 Internet Explorer 中打开。我希望它们在默认浏览器中打开。
注意我说的是 WPF WebBrowser。WinForms 浏览器有很多解决方案,但它们不适用于 WPF 浏览器。
最常见的“解决方案”是处理 Navigating 事件,取消它,然后用 URL 做你自己的事情。这不起作用,因为当我单击 HTML 中的链接时未调用导航事件。
我发现的另一个解决方案似乎确实有效,但有时只是出于某种奇怪的原因:https ://stackoverflow.com/a/9111151/573249
我现在有以下代码,使用上面链接中的方法:
private void WebBrowser_OnNavigating(object sender, NavigatingCancelEventArgs e)
{
// Just for demonstration purposes
// This is NOT CALLED when a link is clicked
Debug.WriteLine("> Navigating called.");
if (e.Uri == null)
{
Debug.WriteLine(">> URI was null.");
return;
}
e.Cancel = true;
Process.Start(e.Uri.AbsolutePath);
Debug.WriteLine(">> Navigation cancelled and opened in default browser.");
}
private void WebBrowser_OnLoadCompleted(object sender, NavigationEventArgs e)
{
Debug.WriteLine("> LoadCompleted called.");
mshtml.HTMLDocument doc;
doc = (mshtml.HTMLDocument) webBrowser.Document;
mshtml.HTMLDocumentEvents2_Event iEvent;
iEvent = (mshtml.HTMLDocumentEvents2_Event) doc;
iEvent.onclick += new mshtml.HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler);
Debug.WriteLine("> LoadCompleted finished!");
Debug.WriteLine("------");
}
private bool ClickEventHandler(mshtml.IHTMLEventObj e)
{
// This finally opens the URL in the default browser
// The method is called only 20% of the time.
Debug.WriteLine(">> Click event handler called.");
var a = (mshtml.HTMLAnchorElement) e.srcElement;
Process.Start(a.href);
return false;
}
当我点击一个链接时,它似乎有 20% 的时间可以工作。在这些情况下,将调用“ClickEventHandler”,并在默认浏览器中打开链接。在其他 80% 的情况下,“ClickEventHandler”永远不会被调用(并且链接会在 IE 中打开),即使“OnLoadCompleted”会毫无例外地完成。
似乎没有一种模式,尽管当它一旦失败时,它似乎在同一个文档上永远失败,直到我重新加载 HTML。重新加载后,它恢复到 20% 的工作机会。
这是怎么回事?