Открытые ссылки во внешнем браузере в WebView (WinRT)

У меня есть компонент WebView, который я использую для отображения HTML-объявлений в моем приложении. Когда пользователь нажимает на объявление в WebView, я хочу открыть ссылку Ad во внешнем браузере. Как это сделать?

Мне нужно что-то вроде OnNavigating из браузера WP7. Я попробовал событие Tapped в WebView, но он никогда не вызывается, даже когда я устанавливаю IsTapEnabled = true. Мне нужно что-то вроде

Ответ 1

Для этого вам нужно использовать событие ScriptNotify. Вот как я обработал сценарий (используя NavigateToString). Если вы извлекаете содержимое веб-представления из URL-адреса, вам нужно будет иметь возможность изменять HTML-код для работы.

  • Добавьте в свой HTML-код следующий Javascript

    <script type="text/javascript">for (var i = 0; i < document.links.length; i++) { document.links[i].onclick = function() { window.external.notify('LaunchLink:' + this.href); return false; } }</script>
    

    Это добавляет обработчик onclick к каждой ссылке (< a href= "..." > </a> ) на странице. window.external.notify - это метод Javascript, который работает в Webview.

  • Добавьте обработчик события ScriptNotify в веб-представление.

    WebView.ScriptNotify += WebView_ScriptNotify;
    
  • Объявить обработчик событий

    async private void WebView_ScriptNotify(object sender, NotifyEventArgs e)
    {
        try
        {
            string data = e.Value;
            if (data.ToLower().StartsWith("launchlink:"))
            {
                await Launcher.LaunchUriAsync(new Uri(data.Substring("launchlink:".Length), UriKind.Absolute));
            }
        }
        catch (Exception)
        {
            // Could not build a proper Uri. Abandon.
        }
    }
    

Обратите внимание, что если вы используете внешний URL-адрес, это должно быть добавлено в веб-просмотр, разрешенный белый список Uris (http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webview.scriptnotify для справки).

Ответ 2

Попробуйте обработать событие NavigationStarting. Здесь вы можете перехватить и отменить загрузку URL. Вы можете отфильтровать, какую ссылку открыть в веб-представлении и открыть в браузере по умолчанию.

private async void webView_NavigationStarting(WebView sender, WebViewNavigationStartingEventArgs args)
    {
        if(null != args.Uri && args.Uri.OriginalString == "URL OF INTEREST")
        {
            args.Cancel = true;
            await Launcher.LaunchUriAsync(args.Uri);
        }
    }