在WebView(WinRT)中打开外部浏览器中的链接

Igo*_*man 11 c# xaml microsoft-metro windows-runtime winrt-xaml

我有一个WebView组件,用于在我的应用程序中显示HTML广告.当用户在WebView中单击广告时,我想在外部浏览器中打开广告链接.我怎么做?

我需要像WP7浏览器那样的OnNavigating.我尝试了WebView的Tapped事件,但即使设置IsTapEnabled = true,它也永远不会被调用.我需要类似的东西

Aki*_*ale 20

您需要使用ScriptNotify事件.以下是我处理场景的方法(使用NavigateToString).如果您要从URL检索Web视图内容,则需要能够修改HTML才能使其生效.

  1. 将以下Javascript代码添加到HTML中

    <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>
    
    Run Code Online (Sandbox Code Playgroud)

    这会在页面上的每个链接(<a href="..."> </a>)上添加一个onclick处理程序.window.external.notify是一个在Webview中工作的Javascript方法.

  2. 将ScriptNotify事件处理程序添加到webview.

    WebView.ScriptNotify += WebView_ScriptNotify;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 声明事件处理程序

    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.
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用外部URL,则必须将其添加到webview允许的Uris白名单(http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml. controls.webview.scriptnotify供参考).


slo*_*ans 12

尝试处理NavigationStarting事件.在这里,您可以拦截并取消加载URL.您可以过滤在Web视图中打开的链接以及在默认浏览器中打开的链接.

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)