2

我正在使用 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% 的工作机会。

这是怎么回事?

4

1 回答 1

1

嗨,我遇到了完全相同的问题。OnMouseDown 事件有时会被触发。我无法弄清楚这一点。我只是放弃并改用 WinForm WebBrowser。那么您不需要参考 MSHTML,但需要参考 System.Windows.Forms 和 System.Windows.Interactivity。

XAML

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

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

C#

public WMain() {
  System.Windows.Forms.Application.EnableVisualStyles();
  InitializeComponent();

  WbThumbs.DocumentCompleted += WbThumbsOnDocumentCompleted;
  WbThumbs.Navigate("www.blabla.com");
}

private void WbThumbsOnDocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e) {
  if (WbThumbs.Document == null) return;
  WbThumbs.Document.Click += WbThumbs_Click;
}

private void WbThumbs_Click(object sender, System.Windows.Forms.HtmlElementEventArgs e) {
  var doc = WbThumbs.Document;
  var src = doc?.GetElementFromPoint(e.ClientMousePosition);
  if (src == null) return;
  //...
}
于 2016-02-06T09:49:05.880 回答