WPF WebBrowser - 在默认浏览器中打开链接
Posted
技术标签:
【中文标题】WPF WebBrowser - 在默认浏览器中打开链接【英文标题】:WPF WebBrowser - open links in default browser 【发布时间】:2016-01-28 10:30:06 【问题描述】:我正在使用 WPF System.Windows.Controls.WebBrowser
控件来显示一些从服务下载的 html 内容。有时 HTML 包含应该可以点击的 URL(“a”元素)。
默认情况下,单击此类 URL 时,它会在 Internet Explorer 中打开。我希望它们改为在默认浏览器中打开。
注意,我专门讨论的是 WPF WebBrowser。 WinForms 浏览器有很多解决方案,但它们不适用于 WPF 浏览器。
最常见的“解决方案”是处理 Navigating 事件,取消它,然后用 URL 做你自己的事情。这不起作用,因为当我单击 HTML 中的链接时不会调用 Navigating 事件。
我发现的另一个解决方案似乎确实有效,但有时只是出于某种奇怪的原因:https://***.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% 的工作机会。
发生了什么事?
【问题讨论】:
好吧,我使用 WPF WebBrowser 并处理 Navigation 事件,它对我有用。当我点击 HTML 中的链接时会调用事件。 【参考方案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;
//...
【讨论】:
以上是关于WPF WebBrowser - 在默认浏览器中打开链接的主要内容,如果未能解决你的问题,请参考以下文章