windows phone开发-Webbrowser使用技巧

原文:windows phone开发-Webbrowser使用技巧

5月份开发了脸萌WP版,其中需要使用web技术来绘制图像,于是就使用了原生webbrowser控件。在使用webbrowser control的过程中,发现了一些坑,也总结的几个小技巧,分享给大家。

首先我们需要了解下webbrowser control,与桌面windows平台上的webbrowser一样,都是基于IE内核封装的web展示控件,用法与wpf基本一致,同时也是非托管资源,但wp平台上没有实现IDispose接口,带了了内存控制的挑战。此外,webbrowser本身支持有限的js script和c#代码交互,带来了更多的可操作性。

 

1.c#调用webbrowser function

这里主要是指使用本地代码(C#)和webbrowser加载的Javascript代码的交互行为,利用此方法可以很容易的实现web项目对wp原生项目的移植,这对web开发者来讲是很方便的。这里主要给大家介绍2个API:分别是InvokeScript()方法以及ScriptNotify事件。

InvokeScript方法可以传参并执行webbrowser加载的javascript代码中的函数,实现对应的效果,用法如下:

webbrowser.InvokeScript("initPerson");
webbrowser.InvokeScript("initPerson", new string[] {"0","2001","1" });

第一段就是简单的调用js function,第二行则是传递参数并调用js function。这两种方法使用起来很灵活,足以来处理很多的交互行为。以脸萌WP版为例,我在C#中处理各种用户行为,并将获得的参数传入webbrowser,js 脚本响应后会动态执行,使用web技术绘制出我想要的头像,这非常灵活。

 同时,对js 函数适当的封装可以提高交互效率,因为InvokeScript可传入的参数类型只能为 string[],js函数不恰当的封装会导致交互的困难,甚至是无法交互,下面我举例说明:

 var personA = {
            'eye': {
                'id': 0
            },
            'hair': {
                'id': 0
            }
        };

        function initPerson(person) {
            a = person.eye.id;
            b = person.hair.id;
        }

 

这里的initPerson函数需要直接传入javascript对象,这是InvokeScript难以直接传入的,但我们可以进行简单的封装,就可以顺利的实现意图,如下:

 

var personA = {
            'eye': {
                'id': 0
            },
            'hair': {
                'id': 0
            }
        };

        function initPerson(person) {
            a = person.eye.id;
            b = person.hair.id;
        }
        function drawPerson(eyeId, hairId) {
            personA.eye.id = eyeId;
            personA.hair.id = hairId;
            initPerson(personA);
        }

 这样C#就直接可以写为:

webbrowser.InvokeScript("drawPerson", new string[] {"0","2001" });

 

能够顺利的实现交互,以上只是方法之一,大家还可以直接传入一个字符串,然后再在javascript中进行处理,如下:

function initPerson(person) {
            if (typeof person == 'string')
                var person = eval(person);
            a = person.eye.id;
            b = person.hair.id;
        }

 

C#:

webbrowser.InvokeScript("initPerson", "{ 'eye': {'id': 0 }, 'hair': { 'id': 0}}");

借助神奇的eval()函数,同样可以实现我们想要的效果。MVP郝冠军告诉我,使用eval并不恰当,可以使用Native json API来替代,大家可以自行搜索下用法,使用方式和eval一致。

2.webbrowser调用C#脚本

这里使用的API主要是ScriptNotify事件,可以实现javascript函数调用c#脚本的效果,能够动态的改变整个应用的行为,这能够使得基于web技术的app调用更高级的原生功能,包括位置,推送,动态磁贴等等,是不是觉得很棒呀,下面我们来看简单的实现方式。

首先webbrowser需要注册ScriptNotify事件,以接收来自javascript的信息

 

webbrowser.ScriptNotify += (e, g) =>
            {
                //响应代码
                var result = g.Value;
            };

 

同时,javascript发送数据方式如下:

 

 

window.external.notify("参数");

如此即可实现webbrowser与整个app的动态交互,这是非常便利的。

 

3.webbrowser的内存控制

由于webbrowser是非托管资源,同时wp上未实现IDispose接口,这给app的内存带来了很大压力,每次导航都可以明显发现有20M左右内存没有释放,经过多次检查,发现是webbrowser的资源没有释放,同时也发现强制GC也没有任何效果,最终经过一番学习,通过js来进行释放,大幅减小了内存的消耗,但仍不彻底,诸位大牛如果有好的办法可以指点下我。下面是我的方法:

js中将所有使用的资源都做空处理:

 

function memoryRelease() {
            personA = null;
            window = null;
            CollectGarbage();
        }

C#每次在离开当前页面时执行它:

 

protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            webbrowser.InvokeScript("memoryRelease");
        }

 

CollectGarbage()是IE的一个特有属性,用于释放内存的,使用方法应该是,将该变量或引用对象,设置为null或delete,然后在进行释放动作。

通过这种方式可以有效的减少内存泄漏,仅做抛砖引玉只用。

 

 

最后,silverlight架构下的webbrowser控件虽然坑不少,但仍是一个非常灵活的控件,这对于使用html5开发跨平台app的开发者来讲,是个非常棒的方式。

时间: 2024-08-09 14:18:18

windows phone开发-Webbrowser使用技巧的相关文章

Windows Phone开发(8):关于导航的小技巧

原文:Windows Phone开发(8):关于导航的小技巧 前文用几个例子对导航做了简单介绍,在一般应用中,使用上一篇文章中说到的方法,其实也够用了,不过,为了能够处理一些特殊的情况,有几个小技巧还是有必要了解一下的. 一.到底该不该设置"后退"操作? 因为手机的硬件层就有一个"回退"按钮,按理说我们不需要在程序中再添加什么回退按钮之类的,不过,还是有必要看看如何手动加入回退功能. 1.新建一个WP应用项目. 2.除默认的主页外,新建一个页面Page2.xaml.

windows下开发并编译PHP扩展的方法_php技巧

现在就简单说一在WINDOWS下开发PHP扩展的步骤: 首先需要准备的软件有: cygwin 安装路径e:\app\cygwin visual studio C++ 6.0, 修改环境变量,把已经安装好的PHP路径设置为环境变量.在这里,假设我的PHP安装目录是:e:\app\php5.2.5,那么我把WINDOWS环境变量后面加上这个安装目录.方便一会儿使用php.exe. PHP源代码,这里假设为e:\c_source_code\php-5.2.5 1.修改文件 "PHP源文件目录/ext/

Windows Phone 7开发教程(1)——Windows Phone开发工具初体验

这是为<程序员>4月期写的文章,是在<双重惊喜-- Windows Phone Developer Tools初体验>的基础上增加了一些内容, 包括WebBrowser空间.MediaPlayer空间,还有一个非常简单的XNA程序.希望对 Windows Phone开发有兴趣的朋友有一些帮助. Windows Phone开发工具在MIX 2010上火热登场了.Windows Mobile开发者们 压抑许久的热情终于爆发出来,对于Windows Phone的华丽转身,开发者们褒贬 不

Kinect for Windows SDK开发入门(十四)进阶指引 上

前面十三篇文章介绍了Kinect SDK开发中的各个方面的最基础的知识.正如本系列博闻标题那样,这些知识只是Kinect for windows SDK开发的入门知识.本文将会介绍Kinect进阶开发需要了解一些知识(beyond the basic). 读者可能会注意到,在学习了前面十三篇文章中关于Kinect开发的方方面面,如影像数据流.景深摄像机.骨骼追踪.麦克风阵列.语音识别等这些知识后,离开发出一些我们在网上看到的那些具有良好用户体验的Kinect应用程序还是显得捉襟见肘.Kinect

C#发现之旅第四讲 Windows图形开发入门

为了让大家更深入的了解和使用C#,我们将开始这一系列的主题为"C#发现之旅 "的技术讲座.考虑到各位大多是进行WEB数据库开发的,而所谓发现就是发现我们所 不熟悉的领域,因此本系列讲座内容将是C#在WEB数据库开发以外的应用.目前规划的主要内 容是图形开发和XML开发,并计划编排了多个课程.在未来的C#发现之旅中,我们按照由浅入 深,循序渐进的步骤,一起探索和发现C#的其他未知的领域,更深入的理解和掌握使用C#进 行软件开发,拓宽我们的视野,增强我们的软件开发综合能力. 本次课程说明

Windows App开发之开发准备

操作系统及SDK 操作系统 显而易见,想要开发Windows App就得在Windows 8/8.1/10上进行,老旧的Windows XP/Vista/7已经不能满足时代的需要了.当然,在Windows App的发展过程中,其本身也有着较大的变动,为了使用新的特性,建议使用Windows 10.我在写这个教程时,Windows 10正式版并未面世,因此暂时未介绍Windows 10上的新特性,随后会继续更新,欢迎您的继续关注. 操作系统除了在官网下载之外,还可以在DreamSpark等地方下载

10 个 Visual Studio 原生开发的调试技巧

我以前关于Visual Studio调试技巧的文章引起了大家很大的兴趣,以至于我决定分享更多调试的知识.以下的列表中你可以看到写原生开发的调试技巧(接着以前的文章来编号).这些技巧可以应用在VS2005或者更新版本中(当然有一些可以适用于旧版本).如果你继续,你可以知道每个技巧的详细信息. 数据断点 线程重命名 特定进程中断 大概执行时间 数字格式化 内存数据格式化 系统DLL中断 装载符号表 MFC中内存泄露报告 调试ATL 提示11:数据断点 当数据所在内存位置变化时,调试器将会中断.然而,

Windows Phone开发(1):概论

原文:Windows Phone开发(1):概论Windows Phone是微软公司开发的手机操作系统,这里就不多介绍,和Android,iPhone一样运行在智能手机上,相信大家都很熟悉. 目前来说,Windows Phone(以下称WP),显然其市场还不及IOS,上线的应用也不如安卓和iPhone那么多,不过,我们作为开发者,应该比一般用户清楚,WP的优势也不比其它的手机操作系差的,当我认真去了解WP后,我们肯定会"别有一番滋味"的. 因为是开发技术文章,因此我们仅仅是从开发者的角

Asp.Net Couchbase Memcached图文安装调用开发_实用技巧

安装服务端 服务端下载地址:http://www.couchbase.com/download 选择适合自己的进行下载安装就可以了,我这里选择的是Win7 64. 在安装服务端如果发生如下所示的错误,我在win7 64安装的过程中就遇到了. 这个时候可以先撤销安装.通过CMD命令运行regedit.展开HKEY_LOCAL_MACHINE\Software\Microsoft\ Windows\ CurrentVersion分支,在窗口的右侧区域找到名为"ProgramFilesDir"