Как перехватить, когда пользователь нажимает на ссылку в веб-браузере - PullRequest
7 голосов
/ 10 января 2012

Я пытаюсь перехватить нажатие на ссылку в элементе управления 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 Кроме того, событие Navigating даже не запускается для ссылок, начинающихся с shared: //

Теперь, когда я могу захватить постукивание по общему ресурсу: // Мне все равно, но, по крайней мере, я хотел бы иметь возможность получить URL-адрес, по которому мы собираемся перейти, и отменить значение по умолчанию. операция для определенного URL.

Есть идеи, что происходит? Спасибо

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

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

1 Ответ

5 голосов
/ 11 января 2012

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

Для справки на экране я использую HTML-файл, отображаемый в компоненте WebBrowser.На странице About есть ссылка «Расскажи другу об этом приложении», а также ссылки на внешний веб-сайт.Он также имеет локальные подстраницы.

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

. Также есть ссылка поддержки, которая является ссылкой 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();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...