Silverlight中C#获取与修改HTML DOM元素信息

Silverlight中C#获取与修改HTML DOM元素信息
——Silverlight与JavaScript交互第一篇

第二篇:用JavaScript调用Silverlight(C#)中的方法
第三篇:用Silverlight(C#)调用JavaScript中的方法
==================================

在Silverlight 1.1中主要使用C#或者VB进行开发,用C#来处理Silverlight中的所有事物逻辑,而不再是1.0中的JavaScript。也因而使得Silverlight和JavaScript的交互则开始变得复杂起来,无论是要用JavaScript调用C#中的方法,还是要用C#调用JavaScript中的方法。

用C#和JavaScript交互首先要解决C#读取HTML DOM元素的问题。

在Silverlight中,要用C#来读取HTML DOM中的元素非常简单,在System.Windows.Browser命名空间下,有一个HtmlDocument、HtmlPage、HtmlElement等类,可以用来读取HTML…

Silverlight 1.0 Released

Silverlight 1.0正式版发布,安装包大小1.37M,仍然比1.1 Alpha小很多。目前只发布了Windows平台和Mac平台的正式版。

下载地址:
http://www.microsoft.com/silverlight/downloads.aspx

SDK下载地址:
http://msdn.microsoft.com/vstudio/eula.aspx?id=a40f3ffc-2657-02ec-7d67-7a79b4eac832

看了一下SDK中的更新说明,和1.1 Alpha版的SDK更新说明做了一下对比,两者的Enhancements是一致的,而1.0正式版的Breaking Changes则比1.1 Alpha多出这样三条:

OnLoad, OnError, OnResize, OnFullScreenChange are now Function Pointer Based Rather than String

返回指定Canvas中的所有TextBlock

还是因为要用中文,所以需要遍历所有的TextBlock,一一设置字体……还好,不算复杂,先找根Canvas中的节点,如果是TextBlock就加入到List中,如果是Canvas的话就递归一次,然后把返回结果也加入到List中,最终返回一个TextBlock数组。

TextBlock[] FindAllTextBlock(Canvas container)
{
List tbl = new List();

for (int i = 0; i < container.Children.Count; i++)
{
//如果是TextBlock,就加入到List中
if (container.Children[i].GetType() == typeof(TextBlock))
tbl.Add(container.Children[i] as TextBlock);
//如果是Canvas,就继续递归查找
else if (container.Children[i].GetType() == typeof(Canvas))

Silerlight也可以不放在页面的顶层

很多插件都是位于页面的顶层的,在页面上无论如何也覆盖不了,默认的Silverlight设置也是这样的,但是加一个参数就可以把Silverlight从顶层拿下来了,然后你就可以在上面放上你要的文字,文本框,甚至透明的flash。这个参数就是isWindowless,依然是修改createSilverlight方法,在properties代码块中加上如下一行:

isWindowless: “true”,

这样就把Silverlight从顶层拿下来了。剩下的你就可以发挥啦,用CSS把flash、文本框、按钮放上去吧!…

Silverlight读XML是件痛苦的事情

本来以为Silverlight读XML那岂不是太方便了,没想到用Silverlight来读取XML中的节点原来是件非常令人痛苦的事情,尽管你用的是C#!因为Sivlerlight把WPF精简得太厉害,读XML只有XmlReader了……XmlReader是不支持XPath和XmlDocument的(这么好的东西都不要,莫非是因为Silverlight的体积问题?)

如果要用Silverlight读XML,建议看看这两篇文章:

1. Working with XML in Silverlight

2. howto使用http接收和发送简单的xml请求

有个建议,在读取每个节点的值之前最好先判断一下节点的类型(NodeType),否则很有可能出现一些不可解释的“灵异”现象………

让网页中的Silverlight背景也透明

Silverlight的背景也是可以透明的,改改JS代码就好了~

打开TestPage.html.js(默认的文件名),修改createSilverlight()函数,在properties大括号中增加两行:

isWindowless: “true”,
background: “#00ffffff”,

由于Sivlerlight中的颜色采用ARGB模式,即Alpha、Red、Green、Blue各用两位十六进制数来表示,所以只要把代表Alpha的那两位设置为00就行了,其他的随便了,反正透明了也看不到。

如果是把这两行放到原来代码的最后面(properties大括号以内),要记得把原来的最后一行代码末尾加上一个半角的逗号,而现在的最后一行就不要那个逗号了,即这个样子的:

properties: {
width: “100%”,
height:

在Silverlight中实现定时器功能

上次写了一篇WPF中的定时器类,那个定时器类在Silverlight中也被精简下岗了(还有许多常用的方法或被精简了或直接下岗了,使用起来远没有WPF方便……),定时器还得用,而Timer类实在是不好用(都是因为线程……),只有另想办法了。有个不错的方式,通过Storyboard来实现,把Storyboard的时间设置为一秒,然后在这个Storyboard结束后进行你想要的操作,同时重新开始这个Storyboard,那么这就相当于一个一秒的定时器了,方法很巧。实现代码如下:

loopTimer = new Storyboard();
loopTimer.Duration = TimeSpan.FromSeconds(1);
loopTimer.SetValue(Storyboard.NameProperty, “looptimer”);
this.Resources.Add(loopTimer);

在Silverlight中使用中文

前面的操作方法请参考此文:http://silverlight.cn/forums/thread/549.aspx

我使用的是方案二:

* 首先使用Word或者写字板应用程序,使用您中意的字体输入你的Silverlight中所需要的文字;
* 然后在Word或者写字板当中选择“打印”功能,打印机选择Microsoft XPS Document Writer(在您安装了.NET 3.0 Framework)后会自动增加;
* XPS Document Writer本身是一个打印到文件功能,在其文件选择框中选择文件路径,并且给出相应的文件名;
* 打印完成后,在文件浏览器中找到完成的XPS文件,并且将其后缀名由”.xps”修改为”.zip”;(其实微软的好多文件格式目前都使用了ZIP格式,比如Office 2007中的DOCX、PPTX、XLSX等等,都可以将名字改为ZIP后缀名,并且使用WinZip或者其它文件压缩程序打开)

Silverlight与Flash相比几大缺点

Silverlight是微软正在推广的专门针对Flash的一个浏览器插件,被众多人誉为“Flash”杀手,但从我了解的来看,Silverlight要在短期内打败Flash,并不会有那么容易。

1、跨域读取数据的问题

基于安全考虑,浏览器插件和脚本都是不可以跨域的,Silverlight亦是如此(Silverlight在读取视频文件时可以跨域)。Flash只需在需要跨域的根域下放置一个XML文件即可轻松搞定跨域问题,而Silverlight则需要通过WebService来解决,如果要用WebService,Flash同样也可以随意跨域了。

2、动画制作与设计功能不够强大

Flash在这个方面占有绝对优势,无论从动画设计还是动画编程来说,无论从轻松易用和复杂程度来说Silverlight远远不及Flash。虽然Silverlight可以利用面向对象的C#来进行编程,而AS 3也已经完全成为一种面向对象的编程预言,其语法结构与C#非常类似,Silverlight在这个方面已经没有太多的优势。…