首页 > 代码库 > [WP8开发] WebBrowser控件与后台代码.cs简单的交互

[WP8开发] WebBrowser控件与后台代码.cs简单的交互

大前提:我目前测试的环境是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"/>&nbsp;北京市朝阳区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"/>&nbsp;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

 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

 

[WP8开发] WebBrowser控件与后台代码.cs简单的交互