大前提:我目前测试的环境是Windows Phone 8.1 Silverlight,所以控件是WebBrowser,而不是WebView。
做项目可能要用到网页与后台代码的交互问题,因为可能考虑到跨平台问题,所以公司的网页里某些链接需要客户端自行处理。
有如下HTML示例代码(重要部分):
1 <!--列表标题--> 2 <div class="am-list-news-bd"> 3 <ul class="am-list"> 4 <li class="am-g am-list-item-dated"> 5 <a href="appnews://map/北京市朝阳区XX路66号" class="am-list-item-hd"><img src="/Public/image/xxxaddress.png"/> 北京市朝阳区XX路66号</a> 6 <span class="am-list-date">></span> 7 </li> 8 <li class="am-g am-list-item-dated"> 9 <a href="appnews://tel/010-65431234" class="am-list-item-hd"><img src="/Public/image/xxxphone.png"/> 010-65431234</a> 10 <span class="am-list-date">></span> 11 </li> 12 </ul> 13 </div> 14 </div> 15 <a href="appnews://youhuiquan/123456" class="am-btn am-btn-danger am-btn-block" role="button">领取优惠券</a>
App通常要求处理其中的以appnews://开头的链接,比如appnews://map/地图链接,iOS中用系统封装好的CLGeocoder处理一下就好了,那么WP8中怎么实现呢?
1. 首先设置一个WebBrowser:
<phone:WebBrowser Name="MainWebBrowser"
IsScriptEnabled="True"
LoadCompleted="MainWebBrowser_LoadCompleted"
ScriptNotify="MainWebBrowser_ScriptNotify"/>
1.1 其中IsScriptEnable一定要设为True,系统默认是False的,因为一会儿的工作是要为WebBrowser注入JavaScript代码,所以必须设置为True。
1.2 LoadCompleted事件的作用是为WebBrowser添加JavaScript代码。
1.3 ScriptNotify事件是处理添加的JavaScript代码的逻辑。
1.4 添加语句使控件导航到上面的HTML。
至此前台工作结束。
2. 开始配置后台.cs文件(重要部分):
private void MainWebBrowser_LoadCompleted(object sender, NavigationEventArgs e) { var local = (sender as WebBrowser).Source.LocalPath; if (local.Contains("discount/tid")) { MainWebBrowser.InvokeScript("eval", @" for (var i = 0; i < document.links.length; i++) { document.links[i].onclick = function() { window.external.notify(‘appnews://‘ + this.href); return false; } }"); } } private void MainWebBrowser_ScriptNotify(object sender, NotifyEventArgs e) { string str = e.Value; str = str.Replace("appnews://", ""); if (str.Contains("map/")) { str = str.Replace("map/", ""); Microsoft.Phone.Tasks.MapsTask map = new Microsoft.Phone.Tasks.MapsTask() { SearchTerm = str }; map.Show(); } else { MessageBox.Show("暂不支持该功能", "提示", MessageBoxButton.OK); } }
2.1 LoadCompleted事件中定义需要注入的JavaScript代码,因为我只有某个网页要用到,所以用if语句判断了一下。
调用InvokeScript添加JavaScript代码,目前的功能是点击某个按钮,跳转到地图,
而且网页中不乏有许多以appnews开头的链接,所以用window.external.notify(‘appnews://‘ + this.href)去做匹配。
2.2 当都定义好操作之后,接下来运行代码,点击某个按钮,进入ScriptNotify方法,if语句用来处理传入的字符串,也就是说处理HTML中的href。
2.3 注意:LoadCompleted中的return一定要写false,写true的话WP8会弹出“要从应用商店中搜索应用吗?”的MessageBox。
因为地图用到的是启动器,会导航出去,所以不会触发弹出搜索应用的MessageBox,
如果是其他操作,比如上面给用户提示不支持该功能的MessageBox,点击OK之后就会弹出搜索应用的MessageBox。
至此简单的交互工作全部结束,感谢开发群里的小伙伴提供的部分代码,参考 http://stackoverflow.com/questions/12703698/open-links-in-external-browser-in-webview-winrt
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。