Как перехватить, когда пользователь нажимает на ссылку в браузере

Я пытаюсь перехватить нажатие на ссылку в WebBrowser элемент управления. Моя HTML-страница содержит пользовательские ссылки, для некоторых, начиная с shared: / / я хотел бы перехватить, когда пользователь нажмет на него.

на iPhone я бы использовал метод webView:shouldStartLoadWithRequest: navigationType: и посмотрел на выбранный URL.

мне не удалось воспроизвести аналогичное поведение с Silverlight для 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, к которому мы собираемся перейти, и отменить операцию по умолчанию для определенного URL.

любые идеи что происходит? Спасибо

изменить: Оказалось, что проблема в том, что событие навигации генерируется только для следующих ссылок: file://, http: / / или mailto:// Атрибуты схемы Uri доступны только для ссылок http:// и mailto://

Итак, что я сделал в конце, это заменить shared: / / link на http://shared/blah ... И я смотрю на URL... Это работает для моей цели. Теперь у меня могут быть ссылки, которые имеют другое действие (например открытие дополнительного окна) в зависимости от ссылок в html.

1 ответов


вот мой окончательный код, если это полезно для кого-то в будущем:

для экрана about я использую html-файл, отображаемый в компоненте WebBrowser. На странице о программе есть ссылка" расскажите своему другу об этом приложении", а также ссылки на внешний веб-сайт. Он также имеет локальные подстраницы.

локальные подстраницы связаны с использованием файла: / / link. Они могут перемещаться внутри компонента WebBrowser. Внешние ссылки открываются извне с помощью Internet Explorer. Рассказывать ваш друг ссылка сделана из http://shared ссылка, которая открывает электронное письмо с предварительно установленной темой и телом. К сожалению, никакая другая схема, кроме стандартных, не используется, поскольку они не вызывают навигационное событие

также есть ссылка поддержки, которая является mailto: / / link и открывает 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();
        }
    }