如何在Windows Phone 7 中显示HTML代码

简介:

在早期推广宣传推出Windows Phone 7的时候,我们做了大量的工作去帮助客户建立早期的应用程序,移植他们的已经成熟的应用到WP7市场上来。我们提供指导和协助帮助他们设计开发出符合产品设计标准和遵循WP7应用程序认证规范的应用程序。

  像开发出来的程序有很多比如Telegraph Media Group的Telegraph Fashion应用程序。他们在开发这个应用的过程中和在我们微软技术研发中心的Martin Beeby和Dave Brown花了一些时间解决一个特定的一个问题:如何良好的显示HTML内容?

  在这个应用中数据主要是来自于包含特定格式的HTML代码的RSS 提要。如果是开发Silverlight应用程序一般的做法是使用WebBrowser控件,并且使用NavigateToString()方法通过传递包含HTML代码的字符串参数显示该内容。

  但WP7平台上使用这种方式去显示的时候,开发团队一开始就遇到了一些问题:

  1. WebBrowser控件暂时不能改变其背景色。(默认是白色的背景,在加载中可能会更内容的背景颜色不搭调)。

  2. Telegraph想在他们的应用中把WebBrowser控件缩小放大的功能屏蔽掉。

  我们同时来看待这些问题。为了使WebBrowser更契合用户选择的主题,使WebBrowser能够改变背景色这个需求是很合理的。在黑背景上的白色Browser是要避免的,反之亦然。当时在解决这个问题的过程中,该团队使用一些检测代码去侦测当前的背景颜色。通过转换成一个颜色16进制的值,然后在CSS中去处理当前页面的背景颜色。

  下面是上述方法的代码—我认为或许可以重构成更简单的代码—但是上述方法的整个过程是这样的:在WebBrowser加载过程中,我们先检测当前的字体颜色和背景颜色应该用什么然后设置它们的值最后传递字符串给WebBrowser控件。现在我们忽略脚本—我们来解决第二个问题。

private string FetchBackgroundColor() 

return IsBackgroundBlack() ? "#000;" : "#fff"; 

private string FetchFontColor() 

return IsBackgroundBlack() ? "#fff;" : "#000"; 

private static bool IsBackgroundBlack() 

return FetchBackGroundColor() == "#FF000000"; 

private static string FetchBackGroundColor() 

string color; 
Color mc = 
(Color)Application.Current.Resources["PhoneBackgroundColor"]; 
color = mc.ToString(); 
return color; 

private void wb1_Loaded(object sender, RoutedEventArgs e) 

string fontColor = FetchFontColor(); 
string backgroundColor = FetchBackgroundColor(); 
SetBackground(); 
var html = "<p>Lorem ipsum dolor sit amet, consectetur " + 
"adipiscing elit. Mauris sit amet dignissim purus. " + 
"Pellentesque habitant morbi tristique senectus et " + 
"netus et malesuada fames ac turpis egestas. " + 
"Curabitur ante mauris, tempor congue lobortis id, " + 
"gravida nec mi. Sed laoreet neque eget lacus " + 
"vestibulum vel euismod sapien elementum. Maecenas " + 
"malesuada, orci id facilisis volutpat, dui dui " + 
"cursus nulla, luctus congue magna ligula sed urna." + 
"</p>" + 
"<p>Suspendisse luctus rutrum quam non rutrum. " + 
"Maecenas sed mauris id metus sodales lobortis eu sit " + 
"amet nibh. Lorem ipsum dolor sit amet, consectetur " + 
"adipiscing elit. Donec convallis vehicula lacinia. " + 
"Duis blandit vestibulum tristique. Morbi tincidunt " + 
"lacinia condimentum. Morbi quis ipsum lorem, mollis " + 
"lobortis quam. Curabitur ac lectus justo, non " + 
"placerat sapien. Integer non sem nec elit fermentum " + 
"placerat. Vivamus id metus quam. Aliquam erat " + 
"volutpat. Cras et mauris cursus lectus dignissim " + 
"commodo varius nec ligula.</p>"; 
var htmlScript = "<script>function getDocHeight() { " + 
"return document.getElementById('pageWrapper').offsetHeight;" + 
"}" + 
"function SendDataToPhoneApp() {" + 
"window.external.Notify('' + getDocHeight());" + 
"}</script>"; 
var htmlConcat = string.Format("<html><head>{0}</head>" + 
"<body style=\"margin:0px;padding:0px;background-color:{3};\" " + 
"onLoad=\"SendDataToPhoneApp()\">" + 
"<div id=\"pageWrapper\" style=\"width:100%; color:{2}; " + 
"background-color:{3}\">{1}</div></body></html>", 
htmlScript, 
html, 
fontColor, 
backgroundColor); 
webBrowser1.NavigateToString(htmlConcat); 
webBrowser1.IsScriptEnabled = true; 
webBrowser1.ScriptNotify += 
new EventHandler<NotifyEventArgs>(wb1_ScriptNotify); 

private void SetBackground() 

Color mc = 
(Color)Application.Current.Resources["PhoneBackgroundColor"]; 
webBrowser1.Background = new SolidColorBrush(mc); 
}


对于第二个问题,最初的方法是设置WebBrowser的IsHitTestVisible为False。当然这样做会引发另一个问题,那就是由于WebBrowser中被嵌入了一个ScrollViewer,设置IsHitTestVisible为False后Scrollviewer的滑动也会被相应的禁用。现在的挑战是要把WebBrowser控件的高度设置为内容的高度。

  当时为了解决这个问题考虑了两种方案。第一种就是写一个方法去测量字符串内容的长度,但是这个方案没有被执行。那是因为在需求中数据内容中图片的高度也是须要被测量的。

  另一种方案就把字符串数据传递给WebBrowser控件,然后通过运行JavaScript方法去测量内容的高度,回传高度信息给Silverlight。最后设置WebBrowser控件的高度。这就上面JavaScript代码要做的处理。这个ScriptNotify handler中代码大致如下:

private void wb1_ScriptNotify(object sender, NotifyEventArgs e) 

// The browser is zooming the text so we need to 
// reduce the pixel size by the zoom level... 
// Which is about 0.50 
webBrowser1.Height = Convert.ToDouble(e.Value) * 0.50; 
}
如果不是处理比较长的内容,这个方法是很管用的。但是当WebBrowser的高度设置为超过1800像素时,程序运行是会直接崩溃掉。最后证明,还有更简单的方法能达到同样的效果。

  与设置WebBrowser的IsHitTestVisible不同的是,我们可以在HTML代码中设置meta 标签,这样就可以禁用Browser的放大缩小功能。

<meta name="viewport" content="width=320" /> 
<meta name="viewport" content="user-scalable=no" />
or
?
1    <meta name="viewport" content="width=320,user-scalable=no" />
这里的标签把可视区域设置成320像素(避免水平方向的滑动)同时指定了用户不能在可视区域去缩放可视内容。将这些标签注入到HTML代码中就实现了我们的需求。其实,是很简单的。解决问题的过程就是这样,一步一步,一点一滴,坚持不懈的去思考,问题都是得到比较好的解决的。

  希望对你有帮助,欢迎大家讨论。










本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/771639,如需转载请自行联系原作者
目录
相关文章
|
19天前
|
数据采集 移动开发 前端开发
HTML代码的革命:语义化标签的魅力,让你的网页结构焕然一新!
【8月更文挑战第26天】本文探讨了Web前端开发中的语义化标签概念及其重要性。语义化标签通过使用具有明确含义的HTML标签来构建页面结构,提升了网页的可访问性及搜索引擎优化效果,并增强了代码的可读性和维护性。文章还讨论了实际开发中遇到的问题及未来发展趋势。
27 0
|
9天前
网站维护更新简易单页404页html代码
一个简约风格的单页html页面,可用于网站维护中或更新网站时挂个首页使用,如果不喜欢现在的颜色请F12修改设置既可。
10 1
网站维护更新简易单页404页html代码
|
2天前
|
缓存 JavaScript 前端开发
js和html代码一定要分离吗
JavaScript(JS)和HTML代码的分离虽非绝对必要,但通常被推荐
|
2天前
|
前端开发 JavaScript 开发者
html怎么写才能让代码易读易维护
为了提升HTML代码的可读性和可维护性,应采用语义化标签(如`&lt;header&gt;`、`&lt;nav&gt;`)描述内容意义,保持一致的缩进风格,使用描述性类名和ID,将相关元素分组并添加注释说明,避免内联样式,保持文件结构清晰,利用格式化工具自动整理代码,减少嵌套层级,并遵循W3C标准以确保代码的有效性。这些实践有助于提高开发效率和代码质量。
|
26天前
|
前端开发
HTML静态网页设计作业、仿写大学官网 (力争使用最少的Html 、CSS代码实现)
这篇文章展示了一个仿大学官网的HTML静态网页设计作业,重点在于使用最少的HTML和CSS代码实现页面效果,并便于后期维护。
HTML静态网页设计作业、仿写大学官网 (力争使用最少的Html 、CSS代码实现)
|
29天前
|
前端开发
HTML网页作业代码(仿写商城首页、学校官网网页等、源码可直接运行)
这篇文章提供了HTML网页作业的完整代码,包括仿写商城首页和学校官网网页的源码,以及如何运行和项目结构等详细信息。
HTML网页作业代码(仿写商城首页、学校官网网页等、源码可直接运行)
|
21天前
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
|
4天前
|
Linux 开发者 Python
从Windows到Linux,Python系统调用如何让代码飞翔🚀
【9月更文挑战第10天】在编程领域,跨越不同操作系统的障碍是常见挑战。Python凭借其“编写一次,到处运行”的理念,显著简化了这一过程。通过os、subprocess、shutil等标准库模块,Python提供了统一的接口,自动处理底层差异,使代码在Windows和Linux上无缝运行。例如,`open`函数在不同系统中以相同方式操作文件,而`subprocess`模块则能一致地执行系统命令。此外,第三方库如psutil进一步增强了跨平台能力,使开发者能够轻松编写高效且易维护的代码。借助Python的强大系统调用功能,跨平台编程变得简单高效。
11 0
|
14天前
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
43 0
|
14天前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
57 0