用户单击Web浏览器中的链接时如何拦截

时间:2012-01-10 09:08:12

标签: c# silverlight windows-phone-7

我正在尝试拦截点击WebBrowser控件中的链接。 我的HTML页面包含自定义链接,对于一些从shared开始的链接://我想在用户点击它时拦截它。

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

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

我做的事情如下:

    {
        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 此外,对于以shared://

开头的链接,甚至不会触发导航事件

现在我可以捕获一个共享://我不在乎,但至少我希望能够检索我们要导航到的URL,并取消默认值特定网址的操作。

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

编辑: 事实证明,问题是只为以下链接生成导航事件:file://,http://或mailto:// Uri的scheme属性仅适用于http://和mailto:// links

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

1 个答案:

答案 0 :(得分:5)

这是我的最终代码,以防将来对某人有用:

对于about屏幕,我使用WebBrowser组件中显示的html文件。 关于页面有一个“告诉你的朋友关于这个应用程序”链接以及外部网站的链接。 它还有本地子页面。

本地子页面链接到使用file:// link。这些可以在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();
        }
    }