我有一个WebView组件,用于在我的应用中显示HTML广告。当用户在WebView中单击广告时,我想在外部浏览器中打开广告链接。我该怎么做?
我需要像WP7浏览器那样的OnNavigating。我尝试了WebView的Tapped事件,但即使设置IsTapEnabled = true,它也永远不会被调用。我需要像
这样的东西答案 0 :(得分:20)
您需要使用ScriptNotify事件。以下是我处理场景的方法(使用NavigateToString)。如果您从URL检索Web视图内容,则需要能够修改HTML才能使其生效。
将以下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>
这会在页面上的每个链接(&lt; a href =“...”&gt;&lt; / a&gt;)上添加一个onclick处理程序。 window.external.notify是一个在Webview中工作的Javascript方法。
将ScriptNotify事件处理程序添加到webview。
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.
}
}
请注意,如果您使用的是外部网址,则必须将其添加到网页视图允许的Uris白名单(http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.webview.scriptnotify)以供参考。
答案 1 :(得分:11)
尝试处理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);
}
}