2012-01-10 48 views
7

我试图拦截在WebBrowser控件中的链接点击。 我的HTML页面包含自定义链接,对于一些以shared开头的内容://我想在用户点击它时截取。如何拦截用户点击网页浏览器中的链接

在iPhone上,我会使用webView:shouldStartLoadWithRequest:navigationType:方法,并查看所选的URL。

我还没有设法重现与Windows Phone的Silverlight类似的行为。

我做这样的事情:

{ 
     webBrowser1.Navigating += new EventHandler<NavigatingEventArgs>(webBrowser1_Navigating); 
    } 

    void webBrowser1_Navigating(object sender, NavigatingEventArgs e) 
    { 
     string scheme = null; 

     try 
     { 
      scheme = e.Uri.Scheme; // <- this is throwing an exception here 
     } 
     catch 
     { 
     } 
     if (scheme == null || scheme == "file") 
      return; 
     // Not going to follow any other link 
     e.Cancel = true; 
     if (scheme == "shared") 
     { 

     } 

但我想读URI的一些属性时,当它是一个标准的URI具有缺省文件例外:// URL 此外,该导航事件”不是个t甚至触发链接开始共享://

现在,我能够捕获攻丝共享:/ /我不在乎,但至少我希望能够检索URL我们将导航到并取消特定URL的默认操作。

任何想法发生了什么? 感谢

编辑: 原来,问题是,只对以下链接产生的导航事件:文件:// http://或至mailto:// URI的方案属性是只适用于http://和mailto://链接

所以我最后做的是用http://shared/blah替换shared://链接...然后我看网址...这适用于我的目的。我现在可以拥有不同操作的链接(如打开额外的窗口),具体取决于html中的链接。

+0

其实异常抛出一切,但外部链接(URL以http://开头)或电子邮件(URL以mailto://开头) – jyavenard 2012-01-10 09:14:19

+1

您是否尝试过使用e.Uri.ToString()然后解析它来检索该方案? – 2012-01-10 09:32:51

+0

如何检测何时点击了“shared://”? – keyboardP 2012-01-10 12:41:40

回答

5

这是我最后的代码,如果这是有人在将来有用:

对于有关屏幕,我用在web浏览器组件显示一个HTML文件。 关于页面有一个“告诉你的朋友关于这个应用程序”的链接以及到外部网站的链接。 它也有本地的子页面。

本地子页面使用file://链接进行链接。这些可以在WebBrowser组件内导航。 使用Internet Explorer从外部打开外部链接。 告诉你的朋友链接是由一个http://shared链接组成,该链接打开一个预设主题和正文的电子邮件。不幸的是,没有其他方案比通用的标准是可用的,因为它们不触发导航事件

还有支持链接,这是一个mailto://链接,打开一个EmailComposeTask

void webBrowser1_Navigating(object sender, NavigatingEventArgs e) 
    { 
     String scheme = null; 

     try 
     { 
      scheme = e.Uri.Scheme; 
     } 
     catch 
     { 
     } 
     if (scheme == null || scheme == "file") 
      return; 
     // Not going to follow any other link 
     e.Cancel = true; 
     if (scheme == "http") 
     { 
      // Check if it's the "shared" URL 
      if (e.Uri.Host == "shared") 
      { 
       // Start email 
       EmailComposeTask emailComposeTask = new EmailComposeTask(); 
       emailComposeTask.Subject = "Sharing an app with you"; 
       emailComposeTask.Body = "You may like this app..."; 
       emailComposeTask.Show(); 
      } 
      else 
      { 
       // start it in Internet Explorer 
       WebBrowserTask webBrowserTask = new WebBrowserTask(); 
       webBrowserTask.Uri = new Uri(e.Uri.AbsoluteUri); 
       webBrowserTask.Show(); 
      } 
     } 
     if (scheme == "mailto") 
     { 
      EmailComposeTask emailComposeTask = new EmailComposeTask(); 
      emailComposeTask.To = e.Uri.AbsoluteUri; 
      emailComposeTask.Show(); 
     } 
    } 
+0

您也可以使用“about:”方案。它可以方便地给你AbsoluteUri中冒号后面的所有内容。 – Nedko 2015-06-17 14:52:08