[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

 

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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。