2

WPFSystem.Windows.Controls.WebBrowserコントロールを使用して、サービスからダウンロードされた HTML コンテンツを表示しています。HTML には、クリック可能な URL (「a」要素) が含まれている場合があります。

デフォルトでは、そのような URL をクリックすると Internet Explorer で開きます。代わりにデフォルトのブラウザで開くようにします。

特に WPF WebBrowser について話していることに注意してください。WinForms ブラウザ用のソリューションはたくさんありますが、WPF ブラウザでは機能しません。

最も一般的な「解決策」は、Navigating イベントを処理し、それをキャンセルしてから、URL を独自に処理することです。HTML のリンクをクリックしても Navigating イベントが呼び出されないため、これは機能しません。

私が見つけた別の解決策は機能しているように見えますが、時々奇妙な理由があります: 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% のケースでは、「OnLoadCompleted」が例外なく終了しても、「ClickEventHandler」は呼び出されません (リンクは IE で開きます)。

パターンはないようですが、一度失敗すると、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 に答える