WPF WebBrowser - 在默认浏览器中打开链接

时间:2016-01-28 10:30:07

标签: c# wpf webbrowser-control mshtml default-browser

我正在使用WPF System.Windows.Controls.WebBrowser控件来显示从服务下载的一些HTML内容。有时HTML包含应该可点击的URL(" a"元素)。

默认情况下,单击此类URL时,它将在Internet Explorer中打开。我希望它们在默认浏览器中打开。

注意我正在谈论WPF WebBrowser。 WinForms浏览器有很多解决方案,但它们不适用于WPF浏览器。

最常见的"解决方案"是处理导航事件,取消它然后用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%的工作机会。

发生了什么?

1 个答案:

答案 0 :(得分:1)

嗨我有完全相同的问题。 OnMouseDown事件有时会被触发。我无法理解这一点。我只是放弃了,而是使用了WinForm WebBrowser。 那么你不需要MSHTML的参考,但你需要参考System.Windows.Forms和System.Windows.Interactivity。

XAML

make_video

C#

xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

<WindowsFormsHost>
  <wf:WebBrowser x:Name="WbThumbs"/>
</WindowsFormsHost>