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% の確率で機能するようになります。
どうしたの?