怎样从托管代码访问HTML DOM

这篇文章将演示如何从silverlight程序以编程的形式在托管代码中访问html DOM,控件以及虚拟元素。直接的访问DOM可以让你具备了在客户端直接操纵页面元素的能力,而无需饶个大弯,与服务器进行交互。(这个大概就是开心大哥所说的客户端的内置Tiny Framework

演示步骤:

1 处理XAMLCarvas加载事件

2 html Dom 与事件挂钩。

3 访问Dom的一个属性。

4 Dom中调用一个方法。

 

 

1 silverlight程序中处理XAML事件

使用XAML Carvas  Loaded事件来建立页面和托管类的联系。在XAML文件的Loaded属性中,要指名一个要在托管代码中调用的方法名,它将用来处理这个加载事件。下面的例子将Load事件赋值给负责处理该事件的onloaded 方法。

Canvas

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    x:Class="Samples.Silverlight.CS.BasicCanvas;assembly=HtmlDOM1.dll"

   x:Name="rootCanvas"   Height="500" Width="500" Loaded="OnLoaded"

Background="Red" ></Canvas>

 

 

在托管代码中添加一个在已经在刚才的XAML文件中指名的那个onloaded方法,这个方法能处理任何的初始化任务,创建、注册对象,附加事件处理器等等。

2           public void OnLoaded(object sender, EventArgs e)

 

为了在事件处理方法中能够访问Dom,创建一个私有的组件级别的HtmlDocument类对象,并把它赋值给当前页面的对象。

 

1.                           document = HtmlPage.Document;

 

处理Dom 元素  为了从托管代码中获取对页面元素的引用,你可以使用HTML document  对象的GetElementByID方法来获取,这个方法跟javascript的同名方法类似,也是传递一个页面的元素id给它,来获取元素的引用。例如:

HtmlElement btnEchoText = document.GetElementByID("btnEchoText");

 

 

附加一个事件处理器:为了给button附加上一个 onlick事件,你需要先编程来获取这个button的引用,然后使用如下代码对这个控件进行事件附加处理。

bool ec1 = btnEchoText.AttachEvent("onclick", new EventHandler<HtmlEventArgs>(this.OnEchoTextClicked));

 

 

写一个真正的事件处理方法,以下的方法定义告诉你如何去声明一个私有方法来处理附加在button上的事件。

private void OnEchoTextClicked(object sender, HtmlEventArgs e)

 

 

访问Dom 元素的某个属性

使用Dom对象的属性来访问那个对象。例如你可以使用HtmlPage 对象的属性来获取当前的页面的URIUniform Resource Identifier)。

string outputText = HtmlPage.DocumentUri.AbsolutePath + " - " + HtmlPage.CurrentBookmark;

 

将属性信息赋值给页面的另外一个元素,例如将他赋值给一个文本框。使用SetAttribute方法设置Dom元素的属性值。

document.GetElementByID("txtOutputProperties").SetAttribute("value", outputText);

 

调用在html Dom中的方法:

在你需要调用的那个关联方法里面获取控件的引用。

直接调用dom方法,例如下面的方法演示当点击了按钮后如何利用HtmlPage对象的navigate方法来将浏览器跳转到另外一个url中。

private void OnJump(object sender, EventArgs e)

{

  HtmlPage.Navigate("http://www.msn.com");

}

 

 

不知道支持客户端CLR环境的类有多少,想必应该不多,比如肯定不会有对文件的操作,那silverlight就太恐怖了....不过我曾经幻想过它能够发起tcp连接,这样如果在架构一个非常健壮的客户端程序的时候,效率可能会高些。但是如果这样的话,会不会有黑客在silverlight代码里面发起对别的网站的频繁链接,导致目标网站崩溃呢???不过似乎这个担心不仅仅在silverlight程序上。废话一通了,不过大家还是拭目以待客户端CLR 的功能吧!(很遗憾的告诉大家,目前不支持类似flash的调用本地摄像头api来摄录或者拍大头贴,让部分视频类网站失望了。)

posted on 2007-06-19 00:38  silverlightfans  阅读(1870)  评论(0编辑  收藏  举报