zoukankan      html  css  js  c++  java
  • [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

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

  • 相关阅读:
    The Brain vs Deep Learning Part I: Computational Complexity — Or Why the Singularity Is Nowhere Near
    unity3d NGUI多场景共用界面制作
    python第三方库系列之十九--python測试使用的mock库
    oracle之单行函数
    Andropid自己定义组件-坐标具体解释
    [WebGL入门]二,開始WebGL之前,先了解一下canvas
    【BZOJ2318】【spoj4060】game with probability Problem 概率DP
    苹果改版之后,关于隐私协议加入的问题解决方式
    Binary Tree Level Order Traversal II
    首届中国智慧城市协同创新峰会将于6月20日在大连隆重举行
  • 原文地址:https://www.cnblogs.com/zetianchiang/p/4126318.html
Copyright © 2011-2022 走看看