Web Browser使用技巧
无论是在桌面级开发中,还是在手机端开发中,WebBrowser都是一个经常会用到的控件。Windows Phone中的WebBrowser虽然远远没有桌面版那么强大,但依然足够应付常规用途。本文就来介绍几则Windows Phone中的WebBrowser控件的小技巧。
1.显示HTML片段
WebBrowser的NavigateToString方法可以用来将一段HTML片段显示在WebBrowser中。利用这个方法可以把WebBrowser当作一个增强版的RichTextBox来使用,京东商城的Windows Phone客户端在展示商品信息时就使用了这种技术。而且这种技术还有助于解决Windows Phone中TextBlock显示长文本的一个bug,具体表现为当文本过长时,TextBlock只显示文本的前半段内容,后半段内容不予显示,但却留出了位置(滚动条还能到达,非常诡异),而WebBrowser在显示长文本时就没有这种困扰。
但NavigateToString并不是完美的,假若传入的字符串中包含中文(或其他UTF-8字符)的话,就会显示为乱码。
解决这个问题的方法之一是提前对字符串进行转码,可以参考这篇文章。但这样做的代价是需要遍历所有字符,其实只要把需要显示的HTML片段简单构造成HTML文件,存储到独立存储中,然后再用WebBrowser以常规的方式打开即可解决这个问题。如下面的代码所示:
using (IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication())
{
if (!file.DirectoryExists("temp"))
file.CreateDirectory("temp");
using (IsolatedStorageFileStream fs = new IsolatedStorageFileStream("temp\\review.html", FileMode.Create, file))
{
string html = "<!DOCTYPE html><html lang='zh-CN'><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'></head><body>";
html += e.Review.Summary;
html += "</body></html>";
byte[] bytes = Encoding.UTF8.GetBytes(html);
fs.Write(bytes, 0, bytes.Length);
}
}
this.wb.Navigate(new Uri("temp\\review.html", UriKind.Relative));
2.禁止缩放
WebBrowser支持缩放,但有时我们并不需要缩放功能,譬如在用它来解决TextBlock的长文本bug时。
如果需要禁用一切手势,可以将WebBrowser的IsHitTestVisible设置为False,但这样做的后果是WebBrowser滑动显示内容的功能都会失去。但如果仅仅想要禁用缩放功能,可以在WebBrowser将要显示的HTML的Head中加入这样下面的脚本:
<meta name='viewport' content='width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0' />
关于viewport的更多细节可以参考MSDN Blog的这篇文章。值得注意的是原文在发表时,Windows Phone中的IE还不支持initial-scale、minimum-scale和maximum-scale,而在最新的Windows Phone Mango更新中,除了initial-scale之外的其余属性都已经可以很好的支持了。
3.接管横向滑动
如果用WebBrowser来解决TextBlock的bug,那么还有一个问题需要注意,WebBrowser会接管横向滑动手势,用来移动页面位置,也就是说,假如你把WebBrowser方知道Pivot或Panorama控件中时,就没有办法切换到其他Item了(除非从Header部分横向滑动)。
不过一般在用WebBrowser代替TextBlock时,并需要它内置的横向滑动功能(通常会禁用缩放),所以我们可以想办法侦测发生在WebBrowser上的横向滑动手势,并用来修改Pivot或Panorama的SelectedIndex。所幸的是,Silverlight Toolkit For Windows Phone中有一个组件可以帮我们轻松的完成这项工作。
首先在Xaml中添加GestureService.GestureListener:
<phone:WebBrowser Name="wb" Loaded="wb_Loaded" LoadCompleted="wb_LoadCompleted">
<toolkit:GestureService.GestureListener>
<toolkit:GestureListener Flick="GestureListener_Flick" />
</toolkit:GestureService.GestureListener>
</phone:WebBrowser>
在GestureService.GestureListener的Flick事件中修改Pivot或Panorama的SelectedIndex:
private void GestureListener_Flick(object sender, FlickGestureEventArgs e)
{
if (e.Direction.ToString() == "Horizontal")
{
this.p.SelectedIndex = 1;
}
}
除了Flick之外,GestureService还支持Tap、Double Tap、Touch and Hold、Pan、以及Pinch and Stretch多种手势。关于GestureService的更多信息请参考这篇文章。
转载于http://msdn.microsoft.com/zh-cn/library/hh968322.aspx
Web Browser使用技巧的更多相关文章
- 关于PB调用Microsoft Web Browser控件的一些问题
Microsoft Web Browser控件是WINDOWS系统自带的控件,一般不需要单独安装,由于工作的需要,把使用中遇到的问题记录一下,以便查阅. 插入控件: 环境为PB12.0,insert- ...
- [转]Display PDF within web browser using MVC3
本文转自:http://www.codeproject.com/Tips/697733/Display-PDF-within-web-browser-using-MVC Introduction I ...
- 对于一个网站,如何禁止直接从浏览器Web browser中访问js文件
比如有一个网站,https://testsystem.infotest.com 在这个网站的内容文件目录下面,有一个scripts文件夹,该文件夹中有一个js文件,比如lukeTest.js文件 这样 ...
- 移动Web开发小技巧
移动Web开发小技巧 添加到主屏后的标题(IOS) name="apple-mobile-web-app-title" content="标题"> 启用 ...
- C#彻底解决Web Browser 跨域读取Iframes内容
C#彻底解决Web Browser 跨域读取Iframes内容 用C# winform的控件web browser 读取网页内容,分析一下数据,做一些采集工作. 如果是同一个域名下面还是好办的,基本上 ...
- 教你如何清除 MyEclipse/Eclipse 中 Web Browser 和 Switch Workspace 的历史记录
有些许强迫症的开发人员可能会因为 MyEclipse/Eclipse 中 Web Browser 和 Switch Workspace 冗余的历史记录而感到苦恼,下面的方法就可以有效的帮助解决你的痛点 ...
- How To Open An URL In Android’s Web Browser
How To Open An URL In Android’s Web Browser 以下核心代码片断,将展现使用“android.content.Intent” 打开一个指定的 URL. butt ...
- How to open a web site with the default web browser in a NEW window
http://delphi.about.com/cs/adptips2004/a/bltip0504_4.htm When using ShellExecute (as explained in th ...
- Have your GDX app run in the web browser
https://code.google.com/p/libgdx-users/wiki/Applets—————————————————————————————————————————————— Ha ...
随机推荐
- ECC中的CRM UI端摆弄
前段时间想搞CRM了,可是公司没有环境,就去ECC直接试试事务码,结果竟然可以打开网页...兴奋之余又去看了一下CRM里的一些CLASS,结果很多都是没有的.沮丧! 后来想想,只能用UI的框架,挂WD ...
- Laravel
Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...
- 分形树Fractal tree介绍——具体如何结合TokuDB还没有太懂,先记住其和LSM都是一样的适合写密集
在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...
- linux win 的换行转换
Linux和Windows和换行符不一样.Windows下是CRLF(\r\n或0d0a),Linux下是LF(\n或0a).在Linux下有时会遇到从Windows过来的文本文件,这些文件带了Win ...
- 使用SoundPool播放音效
针对应用程序经常需要播放密集.短促的音效,因为MediaPlayer存在如下缺点: 1.资源占用量较高.延迟时间较长. 2.不支持多个音效同时播放. SoundPool使用音效池的概念来管理多个短促的 ...
- sql 查询强制使用HASH连接性能测试比较
HASH JOIN 散列连接 hash join是CBO 做大数据集连接时的常用方式.优化器扫描小表(或数据源),利用连接键(也就是根据连接字段计算hash 值)在内存中建立hash表,然后扫描大表, ...
- numpy 总结
1.array.sum() from numpy import * import operator group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) ...
- Linux 常用命令杂记
移动光标:h:向左移动j:向下移动k:向上移动l:向上移动 与window 光标移动键功能一致. 常用命令行:shift + ^ 行首shift + $ 行尾ctrl + v 可视模式 , 选择一个范 ...
- IT公司100题-13-求链表中倒数第k个结点
问题描述: 输入一个单向链表,输出该链表中倒数第k个结点.链表倒数第0个节点为NULL. struct list_node { int data; list_node* next; }; 分析: 方法 ...
- Openstack Swift中间件编写
关于openstack swift的资料可以看这里,这里还有这里. 准备环境 从零开始接触的同学可以先从swift的all in one部署开始学习,在本机搭建好swift环境就可以进行简单的测试了. ...