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 ...
随机推荐
- AppSettings和ConnectionStrings的区别
AppSettings是ASP.NET1.1时期用的,在.NET Framework 2.0中,新增了ConnectionStrings. 1.<connectionStrings> &l ...
- 230. Kth Smallest Element in a BST ——迭代本质:a=xx1 while some_condition: a=xx2
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...
- linux tar 增量备份命令
tar --newer-mtime "2013-09-17 00:00:00" -zcvf /var/www/good.tar.gz spider/
- mac 找文件
如何找到 etc 方法1: ! D# D! s2 F" f 七度苹果电脑软件1.打开Finder,按快键盘 Command + Shift + G,即可调出 前往文件夹 ,也可以左上角 找到 ...
- HADOOP :: java.lang.ClassNotFoundException: WordCount
I am using eclipse to export the jar file of a map-reduce program. When i am run the jar using comma ...
- 使用@Controller注解为什么要配置<mvc:annotation-driven />
自己看了官方文档,也到网上查了下,目前理解如下: <mvc:annotation-driven/>相当于注册了DefaultAnnotationHandlerMapping和Annotat ...
- ANGULAR JS WATCH监听使用
ANGULAR 监听使用: 当angular数据模型发生变化时,我们需要如果需要根据他的变化触发其他的事件. $watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. ...
- xampp搭建服务器环境、html5新的input类型
怎么让别人看见你写的 先把你的文档放入htdocs里面 再输入网址: http://你的IP地址/文件名 就ok了例如我的 HTML5中的input类型: <input>标签规定用户可输入 ...
- UDPsocket编程
socket编程UDP模式, package com.wtd.socket.udp; import java.io.IOException; import java.net.DatagramPacke ...
- C char** 的一点儿理解
理解是就是char** 相当于字符串数组,我以往纠结于该用 **arr还是*arr还是 (*arr),还是(**arr): 对于**arr而言:*arr代表数组的最开头,也就是第一个字串的内容.**a ...